Django URL分发器
urlpatterns中的每个正则表达式在首次访问时编译,因此系统速度异常快。
基本格式
1 from django.conf.urls import url 2 3 urlpatterns = [ 4 url(正则表达式, views视图函数,参数,别名), 5 ]
Django2.0版本的路由系统新写法:
1 from django.urls import path 2 3 urlpatterns = [ 4 path('articles/2003/', views.special_case_2003), 5 path('articles/<int:year>/', views.year_archive), 6 path('articles/<int:year>/<int:month>/', views.month_archive), 7 path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail), 8 ]
正则表达式:一个正则表达式字符串
views视图函数:一个可调用对象,通常为一个视图函数或一个指定视图函数路径的字符串
参数:可选的要传递给视图函数的默认参数(字典形式)
别名:一个可选的name参数
补充:
# 是否开启URL访问地址后面不为/跳转至带有/的路径的配置项 APPEND_SLASH=True #作用在于自动在网址结尾加/
正则详解-基本的配置
1 from django.conf.urls import url 2 3 from . import views 4 5 urlpatterns = [ 6 7 url(r'^articles/2003/$', views.special_case_2003), 8 9 url(r'^articles/([0-9]{4})/$', views.year_archive), 10 11 url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive), 12 13 url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail), 14 15 ]
Urlpatterns中的元素按照书写顺序从上至下逐一匹配,一旦成功就不再继续
若从url中获得一个值,只需要将其放在一个圆括号中(分组匹配)
分组命名匹配
([0-9]{4})这种使用简单的正则表达式分组匹配(通过圆括号)获得URL的值并以位置参数的形式传递给视图。用分组命名匹配的方式捕获URL中的值并以关键字参数的方式传给视图。
基本格式:(?P<name>pattern)
urlpatterns=[ url(r’^articles/(?P<x>\d{4})/(?P<y>\d{2})/’, views.test), ]
视图函数应该:
test(request, x=’1277’, y=’12’)
URLconf匹配的位置
URLconf不检查请求的方法,所有的请求(同一URL的POST、GET、HEAD等)都将路由到相同函数。捕获到的只是普通的字符串类型。
urlpatterns=[ url(r’^test/’,views.test), ]
这样的模式,URL捕获不到任何东西。
Include其它的URLconfs
from django.conf.urls import url,include urlpatterns = [ url(r’^admin/’, admin.site.urls), url(r’^app01/, include(‘app01.urls’),#可以包含其它的URLconfs文件 ]
传递额外的参数给视图函数
URLconfs具有个钩子,让我们传递python字典作为额外参数传递给视图函数
Django.conf.urls.url()函数可以接收一个可选第三个参数,它是个字典,表示想要传递给视图函数额外关键参数。
from django.conf.urls import url from . import views urlpatterns = [ url(r’^app01/(?P<year>\d{4})/’, views.test, {‘foo’:’bar’}), ]
将调用test(request, year=’2005’, foo=’bar’)。这个技术在Syndication框架中使用,来传递元数据和选项给视图。
命名URL和URL反向解析
作用:
- 获得URL的最终形式
- 符合DRY机制
- URL可自动更新而不用遍历项目的源代码来搜索并替换过期的URL
URL反查:
- 在模板中:使用url模板标签
- 在python中:使用django.core.urlresolvers.reverse()函数
- 在更高层的与处理django模型实例相关的代码中:使用get_absolute_url()方法
实例:
url(r’^home/(\d+)/’, views.home, name=’home’),
url(r’^index/(\d+)’, views.index, name=’index’),
在模板中引用:
{% url ‘home’ 2019 %}
在views中引用:
from django.urls import reverse
def redirect_to_year(request):
......
year = 2018
...... return HttpResponseRedirect(reverse(‘index’,args=(year,)))
命名空间模式
即使不同app使用相同的url名称,url的命名空间模式也可以让我们唯一性地反转命名的url。
项目下的总urls.py里:
from django.conf.urls import url, include urlpatterns = [ url(r'^app01/', include('app01.urls', namespace='app01')), url(r'^app02/', include('app02.urls', namespace='app02')), ]
项目app的urls.py里:
from django.conf.urls import url from app01 import views app_name = 'app01' urlpatterns = [ url(r'^(?P<pk>\d+)/$', views.detail, name='detail') ]