7.1 URL 配置小技巧
7.1.1 简化导入函数的方式
- 随着 Django 应用程序越变越复杂,URL 配置的内容会越变越多,一个一个地导入视图函数就显得繁琐
- 为了避免这种麻烦,我们可以导入views 模块自身。
python
from django.conf.urls import include, url
from . import views
urlpatterns = [
url(r'^hello/$', views.hello),
url(r'^time/$', views.current_datetime),
url(r'^time/plus/(d{1,2})/$', views.hours_ahead),
]
7.1.2 在调试模式下提供特殊的 URL
- 说到动态构建urlpatterns,你可能想利用这个技巧在 Django 的调试模式下调整 URL 配置的行为
- 在
mysite\mysite\settings.py中添加:
- 在
python
if settings.DEBUG:
urlpatterns += [path('debuginfo/', views.debug),]
- 这里,仅当DEBUG 的值为True 时,/debuginfo/ URL 才可以访问
7.1.3 具名分组
-
可以使用具名的正则表达式分组捕获 URL 片段,通过关键字参数把片段传给视图
-
Python 正则表达式中,具名分组的句法是(?Ppattern),其中name 是分组的名称,pattern 是要匹配的模式
-
匹配/分组算法
- 如果有具名分组,使用具名分组,忽略非具名分组
- 否则,以位置参数传递所有非具名分组
-
额外的关键字参数都会传给视图
7.1.4 URL 配置搜索的范围
- 搜索的范围不包括GET 或POST 参数,抑或域名
- URL 配置不关心请求方法。也就是说,相同URL 的所有请求方法(POST、GET、HEAD,等等)都交由同一个视图函数处理。
7.1.5 捕获的参数始终是字符串
- 不管正则表达式匹配的是什么类型,捕获的每个参数都以普通的 Python 字符串传给视图,例如
url(r'^reviews/(?P<year>[0-9]{4})/$', views.year_archive),- 虽然[0-9]{4} 只匹配字符串中的整数,但是传给views.year_archive() 视图函数的year 参数是字符串,而不是整数。
7.1.6 为视图的参数指定默认值
python
# URL 配置
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^reviews/$', views.page),
url(r'^reviews/page(?P<num>[0-9]+)/$', views.page),
]
# 视图(在 reviews/views.py 文件中)
def page(request, num="1"):
# 输出指定数量的书评
7.2 性能
-
urlpatterns 中的每个正则表达式在首次访问时编译,因此系统的速度异常得快
-
调用 Python 函数时可以使用关键字参数,也可以使用位置参数,而且有些时候二者同时使用
- 关键字参数
- 要把参数的名称与值一起传入
- 位置参数
- 要按照函数定义中指定的顺序传入
- 最后,还可以混用关键字参数和位置参数,只要把位置参数放在关键字参数前面就行
- 关键字参数
7.3 错误处理
-
找不到匹配所请求 URL 的正则表达式或有异常抛出时,Django 会调用一个错误处理视图。
- 具体使用的视图由四个参数指定。这四个参数是:
- handler404
- handler500
- handler403
- handler400
- 具体使用的视图由四个参数指定。这四个参数是:
-
对多数项目来说,使用默认的处理视图应该就够了;
-
如果想定制,也可以把它们设为其他值
-
这四个参数的值在根 URL 配置中设定,在其他位置设定无效
- 设定的值必须是可调用的对象,
- 或者是表示完整的Python 导入路径的字符串,指向处理相应错误的视图。
7.4 引入其他 URL 配置
- urlpatterns 在任何位置都可以"引入"其他 URL 配置模块。通过这一行为可以把一些 URL 放在另一些名下
python
from django.conf.urls import include, url
urlpatterns = [
...
path('community/', include('django_website.aggregator.urls')),
path('comtact/', include('django_website.comtact.urls')),
...
]
-
Django 遇到include() 时,会把截至那一位置匹配的 URL 截断,把余下的字符串传给引入它的 URL 配置,做进一步处理
-
此外,还可以使用url() 引入额外的 URL 模式。以下述 URL 配置为例
7.6 反向解析 URL
- URL 映射中设计 URL。我们为其提供 URL 配置,然后可以双向使用:
- 从用户(浏览器)请求的 URL 开始,这个方案能调用正确的 Django 视图,并从 URL 中提取可能需要的参数及其值,传给视图。
- 从 Django 视图对应的标识以及可能传入的参数值开始,获取相应的 URL。(反向解析 URL、反向匹配 URL、反向查找 URL 或 URL反转)
- Django 在不同的层中提供了执行 URL 反转所需的工具:
- 在模板中,使用url 模板标签。
- 在 Python 代码中,使用django.core.urlresolvers.reverse() 函数。
- 在处理 Django 模型实例 URL 相关的高层代码中,使用get_absolute_url() 方法。
python
from django.conf.urls import url
from . import views
urlpatterns = [
#...
url(r'^reviews/([0-9]{4})/$', views.year_archive,
name='reviews-year-archive'),
#...
]
html
<a href="{% url 'reviews-year-archive' 2012 %}">2012 Archive</a>
{# 或者把年份存储在一个模板上下文变量中:#}
<ul>
{% for yearvar in year_list %}
<li><a href="{% url 'reviews-year-archive' yearvar %}">{{
yearvar }} Archive</a></li>
{% endfor %}
</ul>
- python代码
python
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
def redirect_to_year(request):
# ...
year = 2012
# ...
return HttpResponseRedirect(reverse('reviews-year-archive', args=(year,)))
7.7 为 URL 模式命名
- 为 URL 模式命名时,要确保不与其他应用中的名称冲突
- 为了减少冲突,可以为 URL 模式的名称加上前缀,
7.8 URL 命名空间
-
URL 命名空间在反转具名 URL 模式时具有唯一确定性,即便不同的应用使用相同的名称也不怕
-
URL 命名空间分为两部分,而且都是字符串:
- 应用命名空间。指明应用的名称。一个应用的每个实例都具有相同的应用命名空间
- 实例命名空间。标识具体的应用程序实例。实例命名空间在整个项目范围内应该是唯一的。不过,实例命名空间可以与应用命名空间相同,供应用的默认实例使用。
-
命名空间中的 URL 使用: 运算符指定
- 例如,管理后台的主页使用admin:index 引用。其中,admin 是命名空间,index 是 URL 的名称。
-
命名空间还可以嵌套。members:reviews:index 在命名空间members 中查找命名空间reviews,再在里面查找index URL。
详细笔记在:Python99网(https://python99.com/python-courses)