Django的路由系统

Django 1.11版本
ULacrosseLConf官方文书档案

U普拉多L配置(UEnclaveLconf)就疑似Django
所支撑网址的目录。它的真相是U凯雷德L与要为该U宝马X5L调用的视图函数之间的映射表。

你正是以这种艺术告知Django,对于那几个UEnclaveL调用这段代码,对于丰富UPAJEROL调用这段代码。

URLconf配置

基本格式:

from django.conf.urls import url

urlpatterns = [
     url(正则表达式, views视图函数,参数,别名),
]

注意:

Django
2.0版本中的路由系统现已替换来上边包车型地铁写法(官方文书档案):

from django.urls import path

urlpatterns = [
    path('articles/2003/', views.special_case_2003),
    path('articles/<int:year>/', views.year_archive),
    path('articles/<int:year>/<int:month>/', views.month_archive),
    path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
]

参数表明:

  • 正则表明式:三个正则表明式字符串
  • views视图函数:三个可调用对象,平日为叁个视图函数或三个钦命视图函数路线的字符串
  • 参数:可选的要传送给视图函数的暗中认可参数(字典格局)
  • 别称:叁个可选的name参数

正则表达式详解

大旨配备

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^articles/2003/$', views.special_case_2003),
    url(r'^articles/([0-9]{4})/$', views.year_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]

注意事项

  1. urlpatterns中的成分遵照书写顺序从上往下逐条相配正则表明式,一旦相称成功则不再接续。
  2. 若要从UCR-VL中捕获三个值,只须求在它周边放置一对圆括号(分组相配)。
  3. 没有要求加上八个开首的反斜杠,因为种种ULacrosseL 都有。例如,应该是^articles
    而不是 ^/articles。
  4. 各样正则表达式前边的’r’ 是可选的但是提议加上。

补充表达

# 是否开启URL访问地址后面不为/跳转至带有/的路径的配置项
APPEND_SLASH=True

Django settings.py配置文件中暗许未有 APPEND_SLASH 那个参数,但 Django
暗许这么些参数为 应用程式END_SLASH = True。 其职能便是机关在网站结尾加’/’。

其效果便是:

咱俩定义了urls.py:

from django.conf.urls import url
from app01 import views

urlpatterns = [
        url(r'^blog/$', views.blog),
]

访问 时,默许将网址自动调换为

假使在settings.py中设置了 APPEND_SLASH=False,此时大家再诉求
时就能唤起找不到页面。

分组命名相配

地点的自己要作为范例遵循规则使用轻松的正则表明式分组相称(通过圆括号)来捕获U陆风X8L中的值并以地点参数方式传递给视图。

在更加尖端的用法中,能够运用分组命名匹配的正则表达式组来捕获U牧马人L中的值并以关键字参数格局传递给视图。

在Python的正则表明式中,分组命名正则表达式组的语法是(?P<name>pattern),其中name是组的名目,pattern是要同盟的格局。

上边是上述UTiguanLconf 使用命名组的重写:

from django.conf.urls import url

from app01 import views

urlpatterns = [
    url(r'^articles/(?P<year>[0-9]{4})/$', views.blog),
    url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{1,2})/$', views.blog1),
    url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{1,2})/(?P<day>[0-9]{1,2})/$', views.blog2),
]

以此完成与日前的演示完全同样,唯有四个轻微的差别:捕获的值作为根本字参数而不是岗位参数字传送递给视图函数。

对此那三个U奔驰G级L调用这段代码凯旋门074网址。举例,针对url /articles/2017/12/也正是按以下办法调用视图函数:

views.blog2(request, year="2018", month="08", day="14")

views使用命名组调用:

from django.shortcuts import render,redirect, HttpResponse

def blog(request, year):
    return HttpResponse("年:%s" % (year))

def blog1(request, year="2018", month="08"):
    return HttpResponse("年:%s ———— 月:%s" % (year, month))

def blog2(request, year="2018", month="08", day="14"):
    return HttpResponse("年:%s ———— 月:%s ———— 日:%s" %(year, month, day))

当访问 /articles/2018/ 调用bolg如下:

凯旋门074网址 1

当访问 /articles/2018/08 调用bolg1如下:

凯旋门074网址 2

当访问 /articles/2018/08/14 调用bolg2如下:

凯旋门074网址 3

在实际上利用中,使用分组命名匹配的方法得以令你的USportageLconf
更加清晰且不轻巧生出参数顺序难题的错误,不过有些开辟职员则以为分组命名组语法太寒碜、繁琐。

对此那三个U奔驰G级L调用这段代码凯旋门074网址。有关到底应该运用哪类,你能够依据本身的喜好来支配。

对此那三个U奔驰G级L调用这段代码凯旋门074网址。UEvoqueLconf相配的岗位

U中华VLconf 在伸手的UEscortL 上追寻,将它当做二个家常的Python
字符串。不包含GET和POST参数以及域名。

例如, 请求中,URLconf 将查找myapp/。

对此那三个U奔驰G级L调用这段代码凯旋门074网址。在 央求中,USportageLconf
仍将找寻myapp/

UENCORELconf 不检讨央求的方法。换句话讲,全部的伸手方法 ——
同二个UKugaL的POSTGETHEAD等等 —— 都将路由到同一的函数。

抓获的参数永恒都是字符串

各种在U智跑Lconf中捕获的参数都用作二个家常的Python字符串传递给视图,无论正则表明式使用的是怎么样匹配格局。例如,上面那行U昂CoraLconf
中:

url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),

传送到视图函数views.year_archive() 中的year 参数长久是一个字符串类型。

视图函数中钦命暗中同意值

# urls.py 中
from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^blog/$', views.page),
    url(r'^blog/page(?P<num>[0-9]+)/$', views.page)
]


# views.py中,可以为num指定默认值
def page(request, num="1"):
    return HttpResponse("这是第[ %s ]页"%(num))

对此那三个U奔驰G级L调用这段代码凯旋门074网址。走访成效如下:

1、访问暗中认可页码时:

凯旋门074网址 4

2、访问钦命页码时:

凯旋门074网址 5

在地点的例证中,八个U奥迪Q5L方式指向一样的view – views.page –
不过首先个格局并未从UTiggoL中抓获任刘帅西。

一经第二个格局相称上了,page()函数将采用其私下认可参数num=“1”,若是第贰个形式相配,page()将使用正则表明式捕获到的num值。

include其他的URLconfs

#At any point, your urlpatterns can “include” other URLconf modules. This
#essentially “roots” a set of URLs below other ones.

#For example, here’s an excerpt of the URLconf for the Django website itself.
#It includes a number of other URLconfs:

from django.conf.urls import include, url

urlpatterns = [
   url(r'^admin/', admin.site.urls),
   url(r'^app02/', include('app02.urls')),  # 可以包含其他的URLconfs文件
]


#app02 中的url和前面的一样的写法

from django.conf.urls import url
from . import views

urlpatterns = [
        url(r'^home/$', views.home),
]

传递额外的参数给视图函数(领会)

U索罗德Lconfs 具备一个钩子,令你传递七个Python
字典作为额外的参数字传送递给视图函数。

django.conf.urls.url() 函数能够收起一个可选的第三个参数,它是二个字典,表示想要传递给视图函数的额外关键字参数。

例如:

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'foo': 'bar'}),
]

在这一个事例中,对于/blog/2007/必要,Django
将调用views.year_archive(request, year=’2005′, foo=’bar’)。
其一技艺在Syndication 框架中央银行使,来传递元数据和选择给视图。

命名U中华VL和U大切诺基L反向剖判

在运用Django
项目时,三个广大的供给是收获U奥迪Q5L的最后格局,以用于放置到变化的剧情中(视图仲阳呈现给用户的U凯雷德L等)可能用于拍卖服务器端的领航(重定向等)。
对此那三个U奔驰G级L调用这段代码凯旋门074网址。人人分明希望不用硬编码那些URAV4L(费力、不可增添且易于发生错误)可能设计一种与UENVISIONLconf
非亲非故的特别的U卡宴L
生成机制,因为这么便于形成一定程度上发出超时的UCRUISERL。
换句话讲,需求的是叁个D纳瓦拉Y 机制。除了别的有一点点,它还同意布置的URubiconL
能够自动更新而不用遍历项目标源代码来搜寻并替换过期的UENCOREL。
收获贰个U君越L
最初叶想到的信息是拍卖它视图的标记(举例名字),查找准确的UEscortL
的其它供给的音讯有视图参数的项目(地方参数、关键字参数)和值。
Django 提供贰个办法是让U途乐L 映射是URAV4L
设计唯一的地点。你填充你的U奇骏Lconf,然后能够双向使用它:

  • 基于用户/浏览器发起的U奇骏L 央浼,它调用正确的Django 视图,并从URAV4L
    中领到它的参数要求的值。
  • 传说Django 视图的标记和将在传递给它的参数的值,获取与之提到的U奥德赛L。

首先种方法是大家在近年来的章节中一直商量的用法。第三种艺术叫做反向深入分析UCR-VL、反向UCR-VL
相配、反向U福睿斯L 查询恐怕轻易的URL 反查。
在急需U奥德赛L 的地点,对于不相同层级,Django 提供不一样的工具用于U途观L 反查:

  • 在模板中:使用url模板标签。
  • 在Python 代码中:使用django.core.urlresolvers.reverse() 函数。
  • 在越来越高层的与拍卖Django
    模型实例相关的代码中:使用get_absolute_url() 方法。

地点说了一大堆,你恐怕并不曾看懂。(那是官方文书档案的机械翻译)。

作者们一言以蔽之便是足以给我们的UCRUISERL相配法规起个名字,多个U冠道L相配形式起三个名字。

这么我们以后就无需写死UOdysseyL代码了,只需求经过名字来调用当前的U福睿斯L。

举个轻便的事例:

url(r'^home', views.home, name='home'),  # 给我的url匹配模式起名为 home
url(r'^index/(\d*)', views.index, name='index'),  # 给我的url匹配模式起名为index

这样:

在模板里面能够那样援引:

{% url 'home' %}

在views函数中得以如此援用:

from django.urls import reverse

reverse("index", args=("2018", ))

列子:

下面的URLconf:

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^index/$', views.index, name="index"),
    url(r'^home/$', views.home, name="home"),
    url(r'^test/$', views.test),
]

views.py:

from django.shortcuts import render,redirect, HttpResponse
from django.urls import reverse

def index(request):
    return render(request, "index.html")

def home(request):
   return render(request, "home.html")

def test(request):
    # 通过reverse跳转到命名空间的URL(home页面)
    return redirect(reverse("home"))

home.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>这里是home页面</h1>
<a href="{%%20url%20'index'%20%}">通过命名反向解析跳转到index页面</a>
</body>
</html>

index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>这里是index页面</h1>
</body>
</html>

此时造访/home/得到如下,同临时候足够跳转也是力所能致得逞跳转的

凯旋门074网址 6

访问/test/得到如下:会发下自动跳转到index页面。

凯旋门074网址 7

将index路由更换为:

url(r'^indexabc/$', views.index, name="index"),

刷新home如下:

凯旋门074网址 8

能够开掘在html文件中通过 {%
url ‘index %} 命超级模特式调用,今后进展改变路由则不会发出震慑,不会招致访问不到

再也做客test页面如下:

凯旋门074网址 9

能够发掘在views文件中经过 return
redirect(reverse(“index”))
命超形式跳转,现在实行更换路由也会自行举办改变,不会招致访问不到

在一些场景中,二个视图是通用的,所以在UPAJEROL
和视图之间存在多对一的涉嫌。对于这一个意况,当反查U卡宴L
时,唯有视图的名字还相当不足。

注意:

为了成功地点例子中的UMuranoL 反查,你将供给利用命名的USportageL 形式。U翼虎L
的名目使用的字符串能够涵盖其余你喜欢的字符。不只限制在合法的Python
名称。

当命名你的U索罗德L
格局时,请确认保障使用的称号不会与其余应用中名称争辩。假让你的UOdysseyL
情势叫做comment,而此外叁个运用中也可以有二个大同小异的称号,当您在模板中动用那些名称的时候不能够担保将插入哪个U凯雷德L。

在U中华VL
名称中加上一个前缀,举个例子利用的称号,将削减抵触的大概。大家建议使用myapp-comment 而不是comment

命名空间格局

纵然差异的APP使用一样的UHavalL名称,U陆风X8L的命名空间情势也能够令你唯一反转命名的URAV4L。

举个例证:

project中的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')),
]

app01中的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')
]

app02中的urls.py

from django.conf.urls import url
from app02 import views

app_name = 'app02'
urlpatterns = [
    url(r'^(?P<pk>\d+)/$', views.detail, name='detail')
]

未来,笔者的三个app中
url名称再一次了,作者反转UENVISIONL的时候就足以由此命名空间的名号获得我眼下的ULacrosseL。

语法:

‘命名空间名称:UXC60L名称’

模板中应用:

{% url 'app01:detail' pk=12 pp=99 %}

views中的函数中接纳

v = reverse('app01:detail', kwargs={'pk':11})

那般尽管app中U昂科拉L的命名同样,笔者也能够反转获得正确的U大切诺基L了。

 

相关文章