2 路由层
一、Django 路由的作用与参数
1 路由的作用:
本质上是 URL 与 URL 调用的视图函数之间的一种映射关系。
2 路由的参数---无名分组:
格式:url(r'pattern',view,kwargs=None,Name=None)
实际上是将各个参数传了进去,调用了 url() 这个函数。
各个参数的作用:
(1)r:原生字符串,说明后面的符号都有其意义。
(2)pattern:正则表达式。若正则表达式中分了多个组,则应该在对应的视图函数中传入对应的参数个数,在 models 层的函数中接收时可用 *args 接收。
(3)view:视图函数
(4)kwargs:None
(5)Name:给视图函数起的别名
pattern 正则表达式的应用:将 url 中的特定部分取出,再加上 .html 可以伪装成静态网页,提高 SEO 权限。
视图函数中:url(r'pattern.html',view)
模板层中:{{ sth }}.html
3 路由关系的特性
从上往下匹配,一旦匹配成功,就不会继续往下匹配了。
url(r'^$',views.index) 表示根路径,可以放在所有路径之后,防止出现 404 页面
4 路由关系---有名分组
格式:url(r'index/(?P<name>pattern)',views.index) 用括号隔开,命名指的是给对应的pattern命名。 可以命名多个,则在对应的视图函数中就可以不用按照位置来接收参数了,参数可设置 default 值;可以用 **kwargs 来接收参数。
5 有名分组和无名分组的注意点
无论是有名分组还是无名分组,捕获的参数类型军事 str 类型。
接收参数时,同时使用 *args 和 **kwargs ,接收时 args 参数会丢失。
6 路由分发
1.0+ 版本
第一种方式: 1️⃣ from django.conf.urls import include 2️⃣ url(r'pattern',include(‘app.urls’)) 3️⃣ 在对应的 app 中创建 urls.py 文件,建议不用更改名字 4️⃣ 在 urls.py 文件中写对应的 pattern 以及视图函数的对应关系,注意 urlpatterns 名字不能更改 5️⃣ 可重复上述步骤,分发多个路由 第二种方式: 只需在第一种方式的基础上稍加修改即可: from app01 import urls 3️⃣ url(r'pattern',include(urls)) 这种方式在路由分发多个的时候,会造成混乱,建议不使用
2.0+ 版本 1️⃣ from django.urls import re_path,path,include 2️⃣ 兼容1.0+ 版本
2.0+ 和 1.0+ 的区别 1️⃣ 2.0+ 版本的 re_path 就是 1.0+ 版本的 url 2️⃣ 2.0+ 版本多了一个 path,但是不支持pattern 3️⃣ path('index/<int:year>',views.index) 多了一些转换器参数: str:匹配除了(/)之外的任意非空字符 int:匹配正整数,包含(0) slug:匹配字母、数字、下划线组成的字符串 uuid:格式化的 uuid path:任意非空字符串,包含了路径分隔符(/),字符串在 ?之前也是可以的
1 from django.urls import path,register_converter 2 3 class Test(): 4 regex = 'pattern' # pattern 的规则可以自己更改 5 6 def to_python(self,value): # 给视图函数使用,参数 value=<int:year> 7 code... # 可以对 value 进行一系列的处理 8 return int(value) 9 10 def to_url(self,value): # 反向解析时使用 11 return '%04d'%value 12 13 14 register_converter(Test,'rename') # 注册一个名字 15 在路由中的使用: 16 path('index/<rename:year>',views.index)
二、反向解析和名称空间
1 反向解析
视图函数中 1️⃣ 路由中开一个访问路径,url(r'test/',views.test), 2️⃣ 给另一个路由命名,url(r'index/',views.index,name='othername'), 3️⃣ 在 views.py 文件中导入三件套,from django.shorcuts import render,HttpResponse,redirect 4️⃣ 对应到相应的视图函数中(test),设置 url=reverse('othername'),这样在访问 test 页面时,就可以跳转到 index 页面了。
html 页面中的设置 {% url 'othername' %}
2 反向解析带参数时
无名分组 1️⃣ 视图函数 url=reverse('othername',args=(参数1,参数2)) 2️⃣ html 页面 {% url 'othername' 参数1 参数2 %} 有名分组 1️⃣ 视图函数 url=reverse('othername',kwargs={key1:value1,key2:value2}) 2️⃣ html页面 {% url 'othername' key1=value1 key2=value2 %} 无名分组的写法同样适用于有名分组的写法
3 反向解析的作用
在修改路由中 url 的时候,其它的地方不需要改动。
4 名称空间
1️⃣ 路由分发时设置一个 名称空间 url(r'pattern',include('app01.urls',namespace='app01')), urlpaterns=[ url(r'pattern',views.test,name='rename') ] url(r'pattern',include('app02.urls',namespace='app02')), urlpaterns=[ url(r'pattern',views.test,name='rename') ] 2️⃣ 在视图函数中的使用 url=reverse('app:rename') 3️⃣ 在模板中使用 {% url 'app:rename' %} 4️⃣ 建议在路由分发时命名不能重名,可使用 app_rename 下划线方式命名。