介绍:
当用户从Django的站点请求页面时,Django系统遵循以下步骤来执行的Python代码:
示例
以下是一个URLconf示例:
from django.urls import path
from . import views
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),
]
说明:
示例请求:
默认情况下,以下路径转换器可用:
str
-匹配任何非空字符串,但路径分隔符除外'/'。如果表达式中不包含转换器,则为默认设置。int
-匹配零或任何正整数。返回一个int。slug
-匹配由ASCII字母或数字以及连字符和下划线字符组成的任何条形字符串。例如, building-your-1st-django-site。uuid
-匹配格式化的UUID。为防止多个URL映射到同一页面,必须包含破折号并且字母必须小写。例如,075194d3-6885-417e-a8a8-6c931e272f00。返回一个 UUID实例。path
-匹配任何非空字符串,包括路径分隔符 '/'。这样,您就可以匹配完整的URL路径,而不是像一样匹配URL路径的一部分str。实例:
url.py:
views.py:
运行效果:
通过浏览器访问服务
注意:url路由,由上而下 进行匹配,如果在上面就匹配成功,则不会向下匹配
通过浏览器访问服务
127.0.0.1:8000/abc ==> root url(根路由) ==> 加载子路由(myweb/urls.py)
==> 正则匹配访问的路径(path) =-=> 视图函数(views.index)
==> views.py index() 响应内容
使用正则表达式:
如果路径和转换器语法不足以定义URL模式,则还可以使用正则表达式。为此,请使用re_path()
代替path()
。
在Python正则表达式中,命名正则表达式组的语法为(?P<name>pattern)
,其中name
是组的名称,并且 pattern是匹配的某种模式。(注意是大P)
这是前面的示例URLconf,使用正则表达式重写:
from django.urls import path, re_path
from . import views
urlpatterns = [
path('articles/2003/', views.special_case_2003),
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[\w-]+)/$', views.article_detail),
]
这可以完成与上一个示例大致相同的操作,除了:
字符串
发送到视图。当从使用切换为使用path(),re_path()反之亦然时,特别重要的是要注意视图参数的类型可能会更改,因此您可能需要调整视图。
使用未命名的正则表达式组(不推荐)
除了命名组语法(例如)之外(?P<year>[0-9]{4})
,您还可以使用较短的未命名组(例如)([0-9]{4})
。
不建议特别使用此用法
,因为这样可以更轻松地在匹配的预期含义和视图的参数之间意外引入错误。
无论哪种情况,建议在给定的正则表达式中仅使用一种样式。当两种样式混合使用时,任何未命名的组都会被忽略,只有命名的组才会传递到视图函数。
为视图参数指定默认值
# URLconf
from django.urls import path
from . import views
urlpatterns = [
path('blog/', views.page),
path('blog/page<int:num>/', views.page),
]
# View (in blog/views.py)
def page(request, num=1):
# Output the appropriate page of blog entries, according to num.
...
当Django找不到与请求的URL匹配的正则表达式时,或者异常引发时,Django将调用错误处理视图。
用于这些情况的视图由四个变量指定。它们的默认值对于大多数项目都是足够的,但通过覆盖其默认值可以进一步定制。
有关详细信息,请参阅自定义错误视图的文档。
这样的值可以在你的根URLconf中设置。在任何其他URLconf中设置这些变量将不起作用。
值必须是可调用的,或者代表视图的完整的Python导入路径的字符串,应该被调用来处理手头的错误条件。
变量是:
关于404错误
templates
,并且在此目录下创建一个404.html
文件在视图函数中也可以指定返回一个404
注意 Http404需要在django.http的模块中引入
# 响应404
raise Http404('纳尼a')
在模板中 404.html(这个模板是自己设计的,并不一定要求这样写)
<!DOCTYPE html>
<html>
<head>
<title>404</title>
</head>
<body>
<center>
<h2>404 not found</h2>
<h3>{ { exception } }</h3>
</center>
</body>
</html>
这些设置一般都是在应用上线的时候设置,平时还是要 让DEBUG = True,我们可以根据错误信息进行提示。
在任何时候,您
urlpatterns
都可以“包含”其他URLconf模块。这实质上是将一组网址“植根于”其他网址之下
例如,下面是本身的URLconf的摘录。它包含许多其他URLconf:
from django.urls import include, path
urlpatterns = [
# ... snip ...
path('community/', include('aggregator.urls')),
path('contact/', include('contact.urls')),
# ... snip ...
]
include()
()时,它会截断与该点匹配的URL的任何部分,并将剩余的字符串发送到包含的URLconf以供进一步处理。如果在视图、模板中使用硬编码的链接,在urlconf发生改变时,维护是一件非常麻烦的事情
示例
from django.urls import path
from . import views
urlpatterns = [
#...
path('articles/<int:year>/', views.year_archive, name='news-year-archive'),
#...
]
根据这种设计,对应于年度归档文件的URL NNNN 是/articles//。
您可以使用以下模板代码获取这些:
<a href="{ % url 'news-year-archive' 2020 % }">2020 Archive</a>
{# Or with the year in a template context variable: #}
<ul>
{% for yearvar in year_list %}
<li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li>
{% endfor %}
</ul>
from django.http import HttpResponseRedirect
from django.urls import reverse
def redirect_to_year(request):
# ...
year = 2019
# ...
return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))
from django.shortcuts import redirect
from django.urls import reverse
def index(request):
year = 2019
return redirect(reverse('ews-year-archive',args=(year,)))