文件名称:urls.py
专业名称:路由层
urlpatterns = [
path('网址后缀名',函数名)
]
如果我们在浏览器输入的网址的后缀名与path的网址后缀名对上,那么就会自动触发后面函数的调用,同时结束掉下面的路由匹配
强调
:
我们通过实践可以得出如果我们在不写斜杠的情况下,也可以匹配上
原理:
因为django会对数据进行二次处理,当第一次匹配的时候,匹配失败;django会自动让浏览器加上一个斜杠进行第二次的判断
当然我们不需要django做这样的处理,我们可以添加并修改一个配置
APPEND_SLASH = False # 默认情况未True
应用场景
:当网址后缀不固定的时候,我们可以使用转换器来匹配
五种转换器:
这里面比较常用的是int(整数)和str(字符串)
举例说明:
path('index//', view.index)
这里的id和info是变量,随意起即可
注意:
转换器匹配到的内容会当作是视图函数的关键字参数传入
这里后缀有几个,那么在视图函数中就要传几个参数
转换器的名字一定要对应视图函数的形参
举例说明:
def index(request, year, info):
pass
语法结构:
re_path(正则表达式,函数名)
一旦网址后缀的正则能够匹配到内容就会自动执行后面的函数,并且结束掉整个路由的匹配
eg:
re_path('^index$', views.index)
当网页的后缀不固定的时候,可以使用转换器来匹配
无名分组我们也可以理解为字面意思,不起别名的分组匹配
这里我们需要具备对正则相关的知识储备:正则表达式
举例说明:
re_path('^index/(\d+)/', views.test)
正则表达式匹配到内容会当作视图函数的关键字参数传给视图函数,这个时候就需要对应的形参来对应
我们也可以通过字面意思可以理解为是给匹配内容起别名代替
在正则表达式中起别名我们使用的是?P<别名>
的方法
举例说明:
re_path('^index/?P\d+/?P.*?/', views.index)
正则表达式匹配到内容会当作视图函数的关键字参数传给视图函数,这个时候就需要对应的形参来对应
注意:在后续的使用中我们是通过别名的形式取得匹配到的数据
定义
随着功能的增加会出现更多的视图,可能之前配置的正则表达式不够准确,于是就要修改正则表达式,但是正则表达式一旦修改了,之前所有对应的超链接都要修改,真是一件麻烦的事情,而且可能还会漏掉一些超链接忘记修改,有办法让链接根据正则表达式动态生成吗? 就是用反向解析的办法。
反向解析
:返回一个结果 该结果可以访问到对应的路由
应用场景
使用方法
在路由urls中对对应关系起别名
re_path('^index/?P\d+/', views.index, name='index_view')
这里name对应的数据,我们就可以通过该数据拿到前面的后缀,不管后缀怎么改变,都不影响我能拿到
定义url时,需要为include定义namespace属性,为url定义name属性
使用时,在模板中使用url标签,在视图中使用reverse函数,根据正则表达式动态生成地址,减轻后期维护成本。
url(r’^’,include(‘index.urls’,namespace=’index’)),
使用反向解析语法
在HTML页面上使用
{% url 'index_view' %}
后端
from django.shortcuts import reverse
reverse('index_view')
重定向的时候,使用方法:return redirect(reverse('index_view'))
强调
: 反向解析的操作三个方法都一样path() re_path() url()
无名反向解析
path('index//', views.index, name='index_view')
使用:
在视图函数
中:reverse('index_view', args=('jason',))
必须根据转换器传对应个数的值
在HTML文件
中:{% url 'index_view' 'jason' %}
有名反向解析
re_path('^index/?P\d+/?P.*?/', views.index, name='index_view')
使用:
在视图函数
中:reverse(‘index_view’, kwargs={‘id’:id, ‘info’: info})
在HTML文件
中:{% url 'index_view' 1 'jason' %}
作用
django中的应用都可以有自己独立的
urls.py templates文件夹 static文件夹
能够让基于django开发的多个应用完全独立 便于小组开发
总路由
path('app01/', include('app01.urls')), # 去到app01的路由层中
path('app02/', include('app02.urls')), # 去到app02的路由层中
子路由
path('after/', views.after) # 查找app01下的数据
path('after/', views.after) # 查找app02下的数据
使用场景
当项目特别大 应用特别多的时候 可以使用路由分发 非常方便!!!
即使不同的APP使用相同的URL名称,URL的命名空间模式也可以让你唯一反转命名的URL。
有路由分发场景下多个应用在涉及到反向解析别名冲突的时候无法正常解析
解决方法一
名称空间
namespace
path('app01/', include(('app01.urls', 'app01'), namespace='app01'))
path('app01/', include(('app01.urls', 'app02'), namespace='app02'))
解决方法二
别名不冲突
也可以保证django项目下没有重复的别名即可
举例说明:
方式1:名称空间
总路由添加名称空间
url(r'^app01/',include('app01.urls',namespace='app01')),
url(r'^app02/',include('app02.urls',namespace='app02'))
应用反向解析自动提示
reverse('app01:index_view')
reverse('app02:index_view')
{% url 'app01:index_view' %}
{% url 'app02:index_view' %}
方式2:只需要确保反向解析的别名在整个项目中不重复即可!!!
可以在别名的前面加上应用名的前缀
url(r'^index/',views.index,name='app01_index_view')
url(r'^index/',views.index,name='app02_index_view')