《精通Django》 第7章 高级视图和URL配置

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)

相关推荐
倔强的石头1061 小时前
场景化落地指南——金仓时序数据库在关键行业的应用实践
数据库·时序数据库·kingbase
海棠AI实验室1 小时前
第2篇:本地目录与资产标准(把“素材—文案—对话—上架”变成可追溯的生产线)
数据库·资产
数据知道1 小时前
在PostgreSQL中并发保存上亿个图片链接和图片md5的对应关系,如何做最合适?
数据库·postgresql
麦麦鸡腿堡1 小时前
MySQL_合计/统计函数
数据库·mysql
GIS之路1 小时前
ArcGIS Pro 添加底图的方式
前端·数据库·python·arcgis·信息可视化
alonewolf_991 小时前
深入理解Redis线程模型:单线程神话与原子性实战
数据库·redis·缓存·分布式架构
五阿哥永琪2 小时前
MySQL面试题 事务实现全解析:Undo Log、Redo Log、锁与 MVCC 协同机制详解
数据库·mysql
txinyu的博客2 小时前
MySQL 学过但是全忘了?15min帮你快速复习
数据库·mysql
数据知道2 小时前
如何使用 httpx + SQLAlchemy 异步高效写入上亿级图片链接与MD5到 PostgreSQL
数据库·postgresql·httpx