Django 如何处理请求? Django URL路由配置方案
简介:
干净优雅的URL方案是高质量Web应用程序的重要细节。
Django 允许您设计自己的 URL,无论您想要什么,都没有框架限制。
要为您的应用程序设计 URL,您可以非正式地创建一个名为 **URLconf**(URL 配置)的 Python 模块。
该模块是纯Python代码,表示Python模式(简单正则表达式)到Python函数(您的视图)之间的简单映射。
1。 Django 如何处理请求?
当用户从 Django 站点请求页面时,Django 系统将执行以下步骤来运行 Python 代码:
首先,Django 使用 ROOT_URLCONF 确定要使用的根 URLconf 模块,特别是在 settings .py 配置中文件。但如果传入的 HttpRequest 对象具有 urlconf 属性(由中间件设置),则其值将用于替换 ROOT_URLCONF 设置。
Django 加载此 Python 模块并查找 urlpatterns 变量。它是 django.urls.path() 和/或 django.urls.re_path() 实例的序列。
Django 依次运行每个 URL 模式,并在第一个与请求的 URL 匹配的 URL 处停止。
当正则表达式匹配时,Django 导入并调用给定的视图,这是一个简单的 Python 函数(或基于类的视图)。该视图获取以下参数:
HttpRequest 实例。
如果匹配的正则表达式不返回任何命名组,则将正则表达式中的匹配项作为位置参数提供。
关键字参数由与正则表达式匹配的任何命名组组成,并被可选 kwargs 参数中指定的任何参数覆盖。
django.urls.path\(\),django.urls.re_path\(\)。
如果正则表达式不匹配或者过程中的任何一点发生异常,Django 会调用适当的错误处理视图。
示例
以下是示例 URLconf:
from 导入路径 django.urls
from 。导入视图
urlpatterns = [
path('articles/2003/',views.special_case_2003),
path('articles//',views.year_archive),♸path( 'articles///',views.month_archive),
path('articles//// ', views.article_detail),
]
描述:
使用尖括号从值中捕获 URL。
捕获的值可以选择包含传感器类型。例如,使用 捕获整数参数。如果不包含 / 转换器,则匹配除字符之外的任何字符串。
无需添加斜杠,因为每个 URL 都有斜杠。例如,文章,而不是/文章。
请求示例:
/articles/2005/03/ 与列表中的第三项匹配。 Django 调用这个函数。
views.month_archive(request, '2005', '03')
/articles/2005/3/ 与任何 URL 模式不匹配,因为列表中的第三项需要两位数的月份。
/articles/2003/ 匹配列表中的第一个模式,而不是第二个,因为模式是按顺序测试的,第一个模式是第一个通过的测试。请随意使用这些命令来插入特殊情况。在这里,Django 调用函数
views.special_case_2003(request)
/articles/2003 将不会匹配任何这些模式,因为每个模式都要求 URL 以斜杠结尾。
/articles/2003/03/03/ 将对应最终的模式。 Django 调用这个函数。views.article_detail(请求, '2003', '03', '03')
2.路径转换器
默认情况下,以下路径转换器可用:
str - 匹配除路径分隔符“/”之外的任何非空字符串。如果表达式不包含转换器,则这是默认值。
int – 对应于零或任何正整数。返回整数。
slug – 匹配任何包含 ASCII 字母或数字以及连字符和下划线字符的行字符串。例如构建您的第一个 django 站点。
uuid – 匹配格式化的 UUID。为了防止多个 URL 映射到同一页面,必须包含破折号并且字母必须小写。例如,075194d3-6885-417e-a8a8-6c931e272f00。返回一个 UUID 实例。
path – 匹配任何非空字符串,包括路径分隔符“/”。这样您就可以比较整个 URL 路径,而不仅仅是 URL 路径的一部分,例如 p。 ?如果以上匹配成功,则不会向下匹配
通过浏览器访问服务
127.0.0.1:8000/abc ==> root url(根路由)==> 加载子路由(myweb/ urls .py )
==>正则访问路径(path)=-=>查看函数(views.index)
==>views.py index()响应内容
使用正则表达式:
如果路径和转换器语法不足以定义 URL 模式,您还可以使用正则表达式。为此,请使用 re_path() 而不是 path()。
在Python正则表达式中,有一种命名一组正则表达式的语法(?Ppattern),其中name是组的名称,pattern是要匹配的特定模式。(注意大写的 P)
这是之前的 URLconf 示例,使用正则表达式重写:
from django.urls import path, re_path
from 。导入视图
urlpatterns = [
路径('articles/2003/',views.special_case_2003),
re_path(r'^articles/(?P[0-9]{4}) /$',views.year_archive),
re_path(r'^文章/(?P[0-9]{4})/(?P[0-9]{2}) /$',views.month_archive),
re_path(r'^文章/(?P[0-9]{4})/(?P[0-9]{2}) /(?P[\w- ]+)/$',views.article_detail),
]
这与前面的示例基本相同,除了:
确切的 URL 匹配是比较有限的。例如,年份 10000 将不再匹配,因为年份整数的长度仅限于四位数字。
每个捕获的参数都将作为字符串发送到显示器,无论正则表达式是否匹配。
当从使用path()、re_path()切换时,反之亦然,特别重要的是要注意视图参数的类型可能会改变,因此您可能需要修改视图。
使用未命名的正则表达式组(不推荐)
除了命名组的语法(例如)(?P[0-9]{4})之外,您还可以使用更短的未命名组(例如)([0- 9]{4})。
强烈建议不要使用这种用法,因为它很容易意外地在匹配的预期含义和显示参数之间引入错误。
在这两种情况下,建议在给定的正则表达式中仅使用一种样式。当两种样式混合时,所有未命名的组都会被忽略,只有命名的组才会传递给显示函数。
定义显示参数的默认值
一个巧妙的技巧是指定显示参数的默认值。以下是示例 URLconf 和视图:
# URLconf
来自导入路径 django.urls
z 。导入视图
urlpatterns = [
path('blog/',views.page),
path('blog/page/',views.page),
]
# 查看(in blog/views.py)
def page (request, num=1 ):
# 按num 打印相应页面的博客文章。
...
在上面的示例中,两个 URL 模式都指向同一视图 -views.page -但第一个模式不会捕获 URL 中的任何内容。
如果第一个模式匹配,page()将使用其默认的num参数1。
如果第二个模式匹配,page()将使用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,在templates目录下创建一个404.html页面,
在settings.py中配置DEBUG = False
在settings.py中
TEMPLATES = [{' DIRS': [os.path.join(BASE_DIR,'templates')] }] ('templates'是自己获取的名称)
同时需要在项目根目录创建文件夹templates并在此目录下创建一个文件 404.html
发生 404 时,自动搜索 404 页面。
您也可以在查看功能中手动报告 404 错误,并有提醒信息
您还可以指定视图函数返回404错误
注意,Http404需要在django.http模块中实现
# Response 404
raise Http404('Nani a')
在404.html中模板(这个模板是我设计的,不一定是这样写的)♸! DOCTYPE html>
404
❙‾♻‾‾2. >404 未找到
{ { 异常 } }
这些设置是一般在应用程序上线时设置,我们通常还是需要DEBUG=True,我们可以根据错误信息来询问。
4. 包含额外的 URLconf 模块
您的 url 模式可以随时“包含”额外的 URLconf 模块。
这本质上是在其他 URL 下“扎根”一组 URL
例如,下面是 Django 网站本身的 URLconf 的摘录。包含更多 URLconf:
from import django.urls include, path
urlpatterns = [
# ... snip ....path('community/', include('aggregator) ' )),
path('contact/', include('contact.urls')),
# ... cut off ...
]
每当 Django 遇到 include( ) 时,就会截断到目前为止已匹配的 URL 的任何部分,并将剩余的字符串发送到包含的 URLconf 进行进一步处理每当 Django 遇到 include() (django.urls.include()) 时,它会截断与此匹配的 URL 的任何部分点并将剩余的字符串发送到包含 URLconf 进行进一步处理。
5。反向 URL 解析
如果在视图和模板中使用硬编码链接,则在更改 urlconf 时维护将非常成问题。
解决方案:创建链接时将Point传递给urlconf名称,动态生成链接地址
显示:使用django.urls.reverse()函数
模板:使用url模板标签示例
在URLconf中
来自导入路径 django.urls
from 。导入视图
urlpatterns = [
#...
path('articles//',views.year_archive, name='news-year-archive'),
# ...
]
年度档案对应的URL NNNN就是按照这个设计的/articles//。
您可以使用以下模板代码获取它们:
2020 Archive
{# 或者模板上下文变量中的年份:#}
{% foryearvar inyear_list %}
{% endfor %}
于V 代码 Python :
from django.http import HttpResponseRedirect
from django.urls importverse
def redirect_to_year(request):
#‾9
# # . .
从 django.django.dangshortcuts 导入重定向返回 HttpResponseRedirect(reverse('news-year-archive', args=(year,)))
或
。 def索引(请求):
year = 2019
返回重定向(reverse('ews-year-archive',args=(year,)))
————————— ————————
版权声明:本文为CSDN博主“小菜鸟~”原创文章,受CC 4.0 BY-SA版权协议管辖。转载时请附上原始出处的链接和本声明。
原文链接:https://blog.csdn.net/weixin_63994459/article/details/125917169
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。