路由系统
URLconf配置
from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图,参数,别名), ]
正则表达式: 正则字符串,匹配路径
views视图: 视图中的函数
参数: 可选,要传递给视图函数的默认参数,字典形式
别名: 可选, name参数
正则表达式
r'' 开头
最开始的/不用加
从上到下匹配,匹配成功就不再继续
APPEND_SLASH
Django settings.py配置文件中默认没有 APPEND_SLASH 这个参数,但 Django 默认这个参数为 APPEND_SLASH = True。 其作用就是自动在网址结尾加'/'。
分组和命名分组
通过括号对正则表达式进行分组匹配,捕获URL中的值并且以位置参数的形式传给视图,在视图函数里定义相应个数的形参就可以
例: url(r'^blog/([0-9]{4})/([0-9]{2})/', views.blog,name='blog')
命名分组匹配的正则表达式来捕获URL中的值并且以关键字参数的形式传给视图,视图函数中必须使用和name相同的形参
URLconf 在请求的URL上查找,捕获的永远都是字符串,不包括GET和POST参数以及域名,所有的请求方法都将路由到相同的函数
视图函数指定默认值
# urls from django.conf.urls import url from app01 import views urlpatterns = [ url(r'^blog/$', views.page), url(r'^blog/page(?P<num>[0-9]+)/$', views.page), ] # views函数中,可以为num指定默认值 def page(request, num="1"): pass
include 路由分发
在urls文件中,可以包含其他的URLconfs文件(有多个app文件,可以看做一级目录,二级目录)
from django.conf.urls import include, url urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^blog/', include('app02')), # 可以包含其他的URLconfs文件 ]
命名URL和URL反向解析
给URL匹配规则定义别名,通过名字来调用当前的URL
静态地址
命名
url(r'^home', views.home, name='home'), # 给url匹配模式起名为home
使用
# 在模板中使用 {% url 'home' %} # 返回一个完成的url # 在py文件中使用(views文件) from django.urls import reverse reverse('home')
分组
命名
url(r'^blog/([0-9]{4})/([0-9]{2})/$', views.blog,name='blog' )
使用
# 在模板中使用 {% url 'blog' '2019' '04' %} 位置参数传参 -----/blog/2019/04
# 在py文件中使用(views文件) from django.urls import reverse reverse('blog',args=('2019','04')) -----/blog/2019/04
命名分组
命名
url(r'^blog/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.blog,name='blog' )
使用
# 在模板中使用 {% url 'blog' '2019' '04' %} 可以按照和分组一样的形式进行传参 {% url 'blog' year='2019' month='04' %} 按照关键字参数的形式进行传参 # 在py文件中使用(views文件) from django.urls import reverse reverse('blog',args=('2019','04')) 按照位置参数的形式进行传参 reverse('blog',kwargs={year:'2019',month:'04'}) 按照关键字参数的形式进行传参
namespace 命名空间
在不同的app文件中,可能会出现url名称重复的现象,可以使用namespace,翻转URL时通过命名空间的名称得到当前的URL
例: 在app01和app02的url文件中,都有detail名称
from django.conf.urls import url, include urlpatterns = [ url(r'^app01/', include('app01.urls', namespace='app01')), url(r'^app02/', include('app02.urls', namespace='app02')), ]
使用
# 在模板中使用 {% url 'app01:detail' pk=12 pp=99 %} # 在py文件中使用 reverse('app01:detail', kwargs={'pk':11})