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 下划线方式命名。
原文地址:https://www.cnblogs.com/Smart1san/p/9628072.html