《精通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)

相关推荐
r i c k17 分钟前
数据库系统学习笔记
数据库·笔记·学习
野犬寒鸦31 分钟前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
IvorySQL1 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·1 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德2 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫2 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i2 小时前
完全卸载MariaDB
数据库·mariadb
纤纡.2 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql
jiunian_cn2 小时前
【Redis】渐进式遍历
数据库·redis·缓存
橙露3 小时前
Spring Boot 核心原理:自动配置机制与自定义 Starter 开发
java·数据库·spring boot