
path(‘网址后缀’,函数名)
一旦网址后缀匹配上了就会自动执行后面的函数
并结束整个路由的匹配
默认情况下,不写斜杠django会做第二次处理
第一次匹配路由匹配不上,会让浏览器添加斜杠再次请求
django配置文件中可以修改是否自动添加斜杠
settings:
APPEND_SLASH = False # 默认为True
当网址后缀不固定时,可以使用转换器来匹配
path('func//' , views.func)
<int:id>:转换器匹配到的内容只能够是int类型,然后会当做视图函数的关键字参数传入
有多少个转换器,那么视图参数的形参个数和名字也要一一对应
def func(request, id):
pass
"""
int:IntConverter()
path:PathConverter()
slug:SlugConverter()
str:StringConverter()
uuid:UUIDConverter()
"""
re_path(‘正则表达式’, 函数名)
只要网址后缀能够匹配上正则就会自动执行后边的函数
并结束整个路由的匹配
re_path('func/',view.func)
"""
如果直接写不加限制条件,那么无论网址的前后有什么,只要中间能够匹配上都可以执行后边的函数
eg:/aaabbbfunc/aaabbb/
所以需要加上限制条件
"""
re_path('^func/$', views.func)
当网址后缀不固定的时候,就需要用到正则中的分组了
re_path('^func/(\d+)/', views.func)
正则表达式匹配到没有起名的分组会当做视图函数的位置参数传递给视图函数
正则匹配也可以传递关键字参数
re_path('^func/(?P\d+)/' , views.func)
正则表达式匹配到有起别名的分组会当做视图参数的关键字参数传递给视图函数
在django1.11中,只支持正则匹配,并且方法是url ()
而django2及以上,可以使用path()、re_path();re_path()等同于url ()
如果html页面上的路由都是直接写死固定了,一旦路由改变,那么所有的相关页面链接都会失效
反向解析:返回一个结果,此结果可以访问到对应路由
# 路由对应关系起别名
path('register/', views.register, name='reg_view')
# 使用反向解析语法
"""html页面"""
{% url 'reg_view' %}
"""后端"""
from django.shortcuts import reverse
reverse('reg_view')
# 使用反向解析,只要路由的别名不更改,那么就能访问到对应路由
当路由中有不确定的匹配因素,那么反向解析时需要提前手动给出不确定因素指定类型与个数的具体的值
path('func/' , views.func, name='fn_id')
"""html页面"""
{% url 'fn_id' 111 %}
"""后端"""
reverse('fn_id', args=(111,))
django中每个应用都可以有自己独立的urls.py、templates文件夹、static文件夹
能够让基于django开发的多个应用完全独立
# 项目同名文件夹下的urls.py为总路由,主要作用就是判断访问的是哪一个应用,然后分发给该应用的子路由做处理
path('app01/', include('app01.urls')) # 只要网址后缀为app01/,那么就将app01/后边的后缀分发给app01下的urls做处理
path('app02/', include('app02.urls'))
# 这是简写方式,标准写法需要先导入相应应用的urls文件,再写入include的括号中
from app02 import urls
path('app02/', include(urls))
# 子路由接收剩余的后缀,再判断是否有对应视图函数
path('func01', views.func01) # app01
path('func01', views.func01) # app02
"""当项目特别大,应用特别多的时候,可以使用路由分发,非常方便"""
在使用路由分发的场景下,多个应用在涉及到反向解析起别名,名字冲突的时候无法正常解析
# 总路由
path('app01/', include('app01.urls'))
path('app02/', include('app02.urls'))
# app01路由
path('func/', views.func, name='fn')
# app02路由
path('func/', views.func, name='fn')
"""
此时调用fn只会是app02
有两种解决方式
"""
# 方式1:名称空间
path('app01/', include(('app01.urls', 'app01.urls'), namespace='app01')) # 创建一个名称空间,后边使用的时候需要加上名称空间使用
"""html页面"""
{% url 'app01:fn' %}
"""后端"""
reverse('app01:fn')
# 方式二:规定使别名不冲突
"""保证django项目下没有重复的别名,例如在别名前加上应用的前缀即可"""