Django(3)
1.路由基础
2.多APP共存,url如何管理(可能出现冲突),模板如何管理(可能出现冲突) ***
3.路由分发(将app自己的路由分发给应用自身管理) ***
4.无名有名分组(re)*****
5.反向解析 *****
6.2.x新特性 ****
-------------------------------
1. url函数:url('^index/$', views.index, {'msg': '默认参数'}, name="路由别名")
2. 有名无名分组: /page/10/1
-- 路由层:'^page/(\d+)/(\d+)/$' 视图层:def page(request, n1, n2) n1=10, n2=1
-- 路由层:'^page/(?P<num>\d+)/(?P<id>\d+)/$' 视图层:def page(request, id, num) num=10, id=1
-- 注:有名无名不能混用
3. 路由分发:
-- 有多个app,1.创建app: startapp app_name -> 2.配置,在settings中配置app信息 -> 在应用自己目录下创建urls.py
-- 主路由:url('^app01/', include('app01.urls', namespace='app01'))
-- 子路由:url('^login/$', views.login, name='login')
-- 访问:/app01/login/
4. 反向解析: {% url 'app01:login' [参数们] %} reverse('app01:login'[, args=() | kwagrs={}])
5. 2.x新特性: url, include, re_path, path
-- re_path同url
-- path采用的是绝对字符串匹配 path('index/', views.index, name='index')
-- path: str|int|slug|uuid|path 语法:path('page/<int:id>/', ...)
-- 自定义转化器:1.按格式自定义转化器类 2.注册自定义转化器类并起转化器名 3.在路由中用转化器名进行匹配
6. 多app共存问题
-- 路由问题:import app01.views as app01_view | 路由分发
-- 模板问题:
-- 在templates文件夹下建立与应用名相同的文件夹,将该应用的模板文件放置自己应用名文件夹下,render(request, 'app01/login.html')
-- 在各自app应用下建立templates文件夹,再在templates下建立与应用同名文件夹,放置自己的模板页面,render(request, 'app01/login.html')
-- 模板页面命名:app01_login.html
-------------------
1.url-------符号 ^ $代表头和尾的定位,一般建议尾$不要用,以免拼接有其他内容无法解析到
2.url-------有4个参数,一般写前2个参数,有需要再展开 url(r'^index/',views.index,False,name='index') # 正则路径 视图函数地址 默认关键字参数,路由别名
3.url--------一般 / 符号在http里不加也是会自动增加,如果不想自动增加到 setting--APPEND_SHASH=False 或 在setting---中间件'django.middleware.common.CommonMiddleware' 注掉
1.无名分组--带位置参数,任意符合都可以: eg: url(r'^index/(\d)+/',views.index)
- 正则表达式:一个正则表达式字符串
- views视图函数:一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
- 参数:可选的要传递给视图函数的默认参数(字典形式)
- 别名:一个可选的name参数
- 无名分组分出几个值,视图函数就要接受几个值(位置参数形式传过来的)
- 注:无名分组和有名分组在url 同一行里不能混用!
- 2种分式是:提高传输安全简化了GET方式的传参主式
2.有名分组--带关键字参数,只能指定关键字才能获得: eg: url(r'^index/(?p<id>\d)+/',views.index) # id 关键字
有名分组分出几个值,视图函数就要接受几个值(按关键字传入,位置可以打乱)
URLconf 会更加明晰且不容易产生参数顺序问题的错误 ,这些好处是以简洁为代价;

多APP共存的路由url分配 ---1.在自己APP文件夹--建立一个url文件夹
多APP共存的模板冲突问题----1.在自己APP文 件夹--建立一个templats文 件夹--把模板移入
解决方案:
2.路由---在主路由下建立路由分发
from django.conf.urls import include
urlpatterns = [
url(r'^app01/', include('app01.urls')),
url(r'^app02/', include('app02.urls')),
]
# 注:主路由分发一定不能使用$正则语法 (错误eg: ^app01/$)
2.模板-在主templats 下建立每一个APP同名的文件夹---将模板移入

路由别名:
1.有些路由会被大量访问(直接访问、间接访问)
2.这些路由可能后期还会发生变化
3.可以给路由设置别名,通过别名访问:<a href="{% url '路由别名' '传入有名无名分组所需参数' %}"></a>
名称空间
主路由:
from django.conf.urls import include
urlpatterns = [
url(r'^app01/', include('app01.urls', namespace='app01')),
url(r'^app02/', include('app02.urls', namespace='app02')),
]
app01应用下路由
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^test/', views.test, name='test')
]
app02应用下路由
from django.conf.urls import url
from app02 import views
urlpatterns = [
url(r'^test/', views.test, name='test')
]
前端页面反向解析:{% url 'app01:test' %} | {% url 'app02:test' %}
视图函数reverse方法:url = reverse('app01:test') | url = reverse('app02:test')
反向解析 reverse
from django.shortcuts import reverse
在视图函数中通过reverse方法反向解析出真实的路径
url = reverse('路由别名')
url = reverse('路由别名', args=(给无名分组赋值))
url = reverse('路由别名', kwargs={给有名分组赋值,key就是有名分组名})
# 向下兼容,不建议使用url, 使用与url相同的re_path
from django.conf.urls import url
urlpatterns = [
path('index/', views.index),
# page/<int:msg>/ page/(?P<msg>(\d+)) # 访问/page/123/
# path('page/<int:msg>/', views.page),
# path('page/<str:msg>/', views.page),
# path('page/<path:msg>/', views.page),
# path('page/<slug:msg>/', views.page),
path('page/<uuid:msg>/', views.page),
]
# 2. path写的是绝对字符串,请求地址必须与路由地址完全匹配
# 3. path拥有五个转换器:
-- str:匹配除路径分隔符(/)外的字符串,默认
-- int:匹配自然数
-- slug:匹配字母、数字、横杠及下划线组成的字符串
-- uuid:匹配uuid形式的数据
-- path:匹配任何字符串,包括路径分隔符(/) (不能用?)
# 原因:自定义正则匹配目标路径
1.自定义类
# 匹配11位的185电话
class CVT185phone:
# 匹配过程
regex = '185\d{8}'
def to_python(self, value):
return int(value)
# 反解过程
def to_url(self, value):
return '%11d' % value
from django.urls import register_converter
from 所在路径 import CVT185phone
register_converter(CVT185phone, 'phone185')

浙公网安备 33010602011771号