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反向解析

作用:

  1. 获得URL的最终形式
  2. 符合DRY机制
  3. URL可自动更新而不用遍历项目的源代码来搜索并替换过期的URL

URL反查:

  1. 在模板中:使用url模板标签
  2. 在python中:使用django.core.urlresolvers.reverse()函数
  3. 在更高层的与处理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')

]
posted @ 2018-06-19 21:23  桥前石头  阅读(141)  评论(0编辑  收藏  举报