Django之URLconf路由

URLconf路由

一个干净优雅的URL方案是高质量Web应用程序中的一个重要细节。

Django可以让你设计URL,无论你想要什么,没有框架限制。

要为应用程序设计URL,您可以非正式地创建一个名为URLconf(URL配置)的Python模块。

这个模块是纯Python代码,是一个简单的Python模式(简单的正则表达式)到Python函数(您的视图)之间的映射。

1. Django是如何处理一个请求:

当用户从Django供电的站点请求页面时,系统遵循以下算法来确定要执行的Python代码:

  1. 首先Django确定要使用的根URLconf模块,通过ROOT_URLCONF来设置,具体在settings.py配置文件中。但是如果传入 HttpRequest对象具有urlconf 属性(由中间件设置),则其值将用于替换ROOT_URLCONF设置。
  2. Django加载该Python模块并查找该变量 urlpatterns。这应该是一个Python的django.conf.urls.url()实例列表。
  3. Django按顺序运行每个URL模式,并在匹配所请求的URL的第一个URL中停止。
  4. 一旦正则表达式匹配,Django将导入并调用给定的视图,这是一个简单的Python函数(或基于类的视图)。
  5. 如果没有正则表达式匹配,或者在此过程中的任何一点出现异常,Django将调用适当的错误处理视图。

示例

以下是一个URLconf示例:

from django.conf.urls import urlfrom . import viewsurlpatterns = [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),
]

说明:

  • 要从URL捕获一个值,只需将其括起来。
  • 没有必要添加一个主要的斜杠,因为每个URL都有。例如^articles,不是^/articles。
  • 正则中的’r’正面的每个正则表达式字符串的中是可选的,但推荐使用。它告诉Python一个字符串是“raw” - 字符串中没有任何内容应该被转义。请参阅Dive Into Python的解释。

示例请求:

  • /articles/2005/03/将匹配列表中的第三个条目。Django会调用该函数 。views.month_archive(request, ‘2005’, ‘03’)
  • /articles/2005/3/ 不符合任何网址格式,因为列表中的第三个条目需要两个数字的月份。
  • /articles/2003/将匹配列表中的第一个模式,而不是第二个模式,因为模式是按顺序测试的,第一个模式是第一个测试通过。随意利用这些命令插入特殊情况。在这里,Django会调用该函数 views.special_case_2003(request)
  • /articles/2003 将不匹配任何这些模式,因为每个模式要求URL以斜杠结尾。
  • /articles/2003/03/03/将匹配最终模式。Django会调用该函数。views.article_detail(request, ‘2003’, ‘03’, ‘03’)

注意:每个捕获的参数都作为纯Python字符串发送到视图,无论正则表达式的匹配是什么,即使[0-9]{4}只会匹配整数字符串。

2. 命名组

  • 上述使用为简单实例,属于正则表达式非命名组(通过括号)捕获URL定位,并将它们作为位置参数传递给视图。

  • 在更高级的使用中,我们可以使用正则表达式命名组来捕获URL定位,并将它们作为关键字 参数传递给视图。

  • 在Python正则表达式中,正则表达式命名组的语法是(?P<name>pattern),其中命名组中的命名就是name,并且 pattern是某些匹配的模式。

实例:

from django.conf.urls import urlfrom . import viewsurlpatterns = [url(r'^articles/2003/$', views.special_case_2003),url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
]

这完成了与上一个例子完全相同的事情,有一个微妙的区别:捕获的值被传递到视图函数作为关键字参数,而不是位置参数。

例如:

  • 请求/articles/2005/03/调用函数 ,。views.month_archive(request, year=‘2005’, month=‘03’) 而不是 views.month_archive(request, ‘2005’, ‘03’)

  • 请求/articles/2003/03/03/调用函数 。views.article_detail(request, year=‘2003’, month=‘03’, day=‘03’)

  • 在实践中,这意味着您的URLconfs稍微更明确,更不容易出现参数命令错误 - 您可以重新排序视图的函数定义中的参数。当然,这些好处是以简洁为代价的; 一些开发人员发现命名组语法丑陋而且太冗长。

URLconf的搜索

URLconf将根据所请求的URL进行搜索,作为普通的Python字符串。这不包括GET或POST参数或域名。

例如:

在请求中https://www.example.com/myapp/,URLconf将寻找myapp/。

在请求中https://www.example.com/myapp/?page=3,URLconf将会查找myapp/。

URLconf不查看请求方法。换句话说,所有的请求方法(GET,POST,HEAD等)都将被路由到相同的URL功能。

指定用于视图参数的默认值

一个方便的技巧是为您的视图参数指定默认参数。下面是一个URLconf和view的例子:

在下面的示例中,两个URL模式指向相同的视图views.page- 但是第一个模式不会从URL捕获任何内容。

如果第一个模式匹配,该page()函数将使用它的默认参数num,“1”。

如果第二个模式匹配, page()将使用num正则表达式捕获的任何值。

# URLconf
from django.conf.urls import urlfrom . import viewsurlpatterns = [url(r'^blog/$', views.page),url(r'^blog/page(?P<num>[0-9]+)/$', views.page),
]
# View (in blog/views.py)
def page(request, num="1"):# Output the appropriate page of blog entries, according to num....

3. 错误处理

当Django找不到与请求的URL匹配的正则表达式时,或者异常引发时,Django将调用错误处理视图。

用于这些情况的视图由四个变量指定。它们的默认值对于大多数项目都是足够的,但通过覆盖其默认值可以进一步定制。

有关详细信息,请参阅自定义错误视图的文档。

这样的值可以在你的根URLconf中设置。在任何其他URLconf中设置这些变量将不起作用。

值必须是可调用的,或者代表视图的完整的Python导入路径的字符串,应该被调用来处理手头的错误条件。

变量是:

  • handler400- 见django.conf.urls.handler400。
  • handler403- 见django.conf.urls.handler403。
  • handler404- 见django.conf.urls.handler404。
  • handler500- 见django.conf.urls.handler500。

关于404错误

  • 404的错误页面,在模板目录中创建一个404.html的页面,
  • 在配置文件中 settings.py DEBUG=False
  • 在出现404的情况时,自动寻找404页面。
  • 也可以在视图函数中 手动报出404错误,带提醒信息
  • 在视图函数中也可以指定返回一个404
注意 Http404需要在django.http的模块中引入# 响应404raise 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>

4. 包括其他的URLconf

在任何时候,您urlpatterns都可以“包含”其他URLconf模块。

这实质上是将一组网址“植根于”其他网址之下

例如,下面是Django网站本身的URLconf的摘录。它包含许多其他URLconf:

from django.conf.urls import include, urlurlpatterns = [# ... snip ...url(r'^community/', include('django_website.aggregator.urls')),url(r'^contact/', include('django_website.contact.urls')),# ... snip ...
]

请注意,此示例中的正则表达式没有$(字符串尾匹配字符),但包含尾部斜线。

每当Django遇到include()(django.conf.urls.include())时,它会截断与该点匹配的URL的任何部分,并将剩余的字符串发送到包含的URLconf以供进一步处理。

5. URL的反向解析

如果在视图、模板中使用硬编码的链接,在urlconf发生改变时,维护是一件非常麻烦的事情

  • 解决:在做链接时,通过指向urlconf的名称,动态生成链接地址
  • 视图:使用django.core.urlresolvers.reverse()函数
  • 模板:使用url模板标签

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/455795.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python中什么是关键字参数_如何使用python语言中函数的关键字参数的用法

一般情况下&#xff0c;在调用函数时&#xff0c;使用的是位置参数&#xff0c;即是按照参数的位置来传值&#xff1b;关键字参数是按照定义函数传入的参数名称来传值的。那么&#xff0c;关键字参数怎么使用&#xff1f;工具/原料 python pycharm 截图工具 WPS 方法/步骤 1 打…

HTML块级元素

在HTML5出现之前&#xff0c;人们一般把元素分为块级、内联和内联块元素。本文将详细介绍HTML块级元素h标题(Heading)元素有六个不同的级别&#xff0c;<h1>是最高级的&#xff0c;而<h6>则是最低的。一个标题元素能简要描述该节的主题从<h1>到<h6>&am…

【SSL】HTTPS配置全过程

服务器配置https协议 HTTPS&#xff0c;是以安全为目标的HTTP通道&#xff0c;简单讲是HTTP的安全版。即HTTP下加入SSL层&#xff0c;HTTPS的安全基础是SSL&#xff0c;因此加密的详细内容就需要SSL。 配置HTTPS就需要证书&#xff0c;关于证书方面不做过多解释&#xff0c;只…

iOS开发UI篇—懒载入

iOS开发UI篇—懒载入 1.懒载入基本 懒载入——也称为延迟载入&#xff0c;即在须要的时候才载入&#xff08;效率低&#xff0c;占用内存小&#xff09;。所谓懒载入&#xff0c;写的是其get方法. 注意&#xff1a;假设是懒载入的话则一定要注意先推断是否已经有了。假设没有那…

python之虚拟环境

Virtualenv(虚拟环境) VirtualEnv用于在一台机器上创建多个独立的Python虚拟运行环境&#xff0c;多个Python环境相互独立&#xff0c;互不影响.这样有很多优点,宝宝们要记住哦,比如: 在没有权限的情况下安装新套件 不同应用可以使用不同的套件版本 套件升级不影响其他应用 …

【解决】subprocess.CalledProcessError: Command ‘(‘lsb_release‘, ‘-a‘)‘ returned non-zero exit status 127

pip list 报错 Traceback (most recent call last):File "/home/sensetime/.pyenv/versions/3.6.5/bin/pip", line 11, in <module>sys.exit(main())File "/home/sensetime/.pyenv/versions/3.6.5/lib/python3.6/site-packages/pip/_internal/cli/main.p…

输出四位完全平方数_完全平方数中的规律

PS&#xff1a;很近之前自己收集的资料一个正整数如果是另一个整数的完全平方&#xff0c;那么我们就称这个数为完全平方数&#xff0c;也叫做平方数。如&#xff1a;0&#xff0c;1&#xff0c;4&#xff0c;9&#xff0c;16&#xff0c;25&#xff0c;36&#xff0c;49&#…

RTP格式图 NNEXB格式和RTP格式

Dove(12337127) 10:15:45我看JM代码里面有些疑问 看好多地方都出现了ANNEXB 时空互换(178316135) 10:16:08h264的2种码流编码格式Dove(12337127) 10:16:19我就不太理解是什么意思 刚才翻标准看见了 刚准备认真看看 Dove(12337127) 10:16:29annexb rtp 是么&#x…

第一阶段冲刺第二天

昨天把以前写过的Java普通用户类和订单类看了看&#xff0c;添加了一些变量 看了一些其他网页的代码 今天继续写关于收藏部分的代码 遇到的困难&#xff1a;还是没有什么头绪&#xff0c;做不到真正的实现转载于:https://www.cnblogs.com/lzxw/p/6800311.html

为企业提供本地销售人员的Universal Avenue获1000万美元A轮融资

为各类B2B企业提供本地销售人员的瑞典初创企业Universal Avenue近日获得了1000万美元的A轮融资。此轮融资由Eight Roads&#xff08;富达国际的投资机构&#xff09;领投&#xff0c;原有投资者Northzone和MOOR跟投&#xff0c;加上2015年获得的500万美元种子轮融资&#xff0c…

Python02期预科课程笔记索引

Python index day01 Python简介 Python发展历程 Python安装以及版本检测PyCharm的安装和破解 day02 Python注释及语句分类 Python命令方式和关键字Python中的变量Python的数据类型PyCharm中的快捷键 day03 Python数据类型转换Python中的运算和运算符Python流程控制 day0…

【Linux分享】Linux常用命令+教程分享

今天分享分为两部分 :) PART01 Linux常用命令分享/ PART02 关于BD面试经验分享 30mins Linux Command: PART 1 你本可以张口就来..... 本篇内容分享的宗旨: 拿下Linux面试 别面试的时候呆呆地说个ls了&#x1f691; 本篇分享详细地介绍了常用Linux指令的功能、语法、参…

万能无线鼠标对码软件_400元就能买ROG无线游戏鼠标,ROG影刃2无线版使用体验...

影刃2是ROG刚刚推出的一款新产品&#xff0c;定位入门游戏玩家。目前市面上定位入门游戏玩家的无线鼠标真不多&#xff0c;400块以内的预算想要选购一款合适的无线游戏鼠标&#xff0c;选择其实非常有限。 就ROG产品线而言&#xff0c;烈刃2的价格到了700块钱&#xff1b;罗技G…

[转帖]H.264 RTP payload 格式(有效载荷)

1. 网络抽象层单元类型 (NALU)NALU 头由一个字节组成, 它的语法如下:---------------|0|1|2|3|4|5|6|7|--------|F|NRI| Type |---------------F: 1 个比特.forbidden_zero_bit. 在 H.264 规范中规定了这一位必须为 0.NRI: 2 个比特.nal_ref_idc. 取 00 ~ 11, 似乎指示这个 NAL…

wampserver 虚拟主机

转载&#xff1a;http://blog.csdn.net/knight_quan/article/details/51830683 1.背景&#xff1a; 在进行网站开发的时候&#xff0c;通常需要以http://localhost或者127.0.0.1等地址来访问本地环境的网站。不过随着开发项目的增多&#xff0c;需要每次先访问localhost然后再选…

PL/SQL的结构

2019独角兽企业重金招聘Python工程师标准>>> [DECLARE] --声明开始关键字/*这里是声明部分,包括PL/SQL中的变量、常量以及类型第等*/BEGIN --执行部分开始标志/*这里是执行部分,是整个PL/SQL块的主体部分,该部分必须存在,可以是SQL语句或流程控制语句等…

cf方框透视易语言代码怎么写_易语言真的那么不入流吗?

很多人鄙视易语言&#xff0c;为什么那么多人一提易语言&#xff0c;除了骂&#xff0c;还是骂&#xff0c;易语言很大错误吗&#xff1f;知乎上的大神们是这么说的一个语言的“入流”&#xff0c;和是不是英文关键字无关&#xff0c;而是和这种语言进入某一子行业的契机有关。…

python发展历程

作者&#xff1a;Vamei 出处&#xff1a;http://www.cnblogs.com/vamei 欢迎转载&#xff0c;也请保留这段声明。谢谢&#xff01; Python是我喜欢的语言&#xff0c;简洁&#xff0c;优美&#xff0c;容易使用。前两天&#xff0c;我很激昂的向朋友宣传Python的好处。 听过之…

【Django】RBAC权限管理系统模块-理解

今天文章分为两部分 :) PART1 RBAC权限管理内容分享/ PART2 关于字节跳动一面 10 Minutes Django-RBAC: PART 1 这权限管理系统主要功能是什么&#xff1f; 顾名思义&#xff0c;在系统中可以灵活的划分角色组&#xff0c;可以根据功能特性来划分&#xff1a;- 比如设置系…

NAL的基本特征

为了保证视频流在不同传输环境中能有效地传输&#xff0c;单纯的高压缩率是不够的&#xff0c;必须提供有效的方法&#xff0c;使视频流能够与传输协议无缝连接&#xff0c;才能应用到各种网络。在以前的标准中&#xff0c;MPEG标准包含系统层&#xff0c;同时制定了H&#xff…