Djangon如何处理一个请求(How Django processes a request)

Posted 笔记是工作中的财富

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Djangon如何处理一个请求(How Django processes a request)相关的知识,希望对你有一定的参考价值。

当用户从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函数(或基于类的视图)。该视图通过以下参数传递:

  • 4.1 一个实例 HttpRequest。
  • 4.2 如果匹配的正则表达式没有返回任何命名组,那么来自正则表达式的匹配将作为位置参数提供。
  • 4.3 关键字参数由正则表达式匹配的任何命名组组成,由可选kwargs参数中指定的任何参数覆盖django.conf.urls.url()

5. 如果没有正则表达式匹配,或在此过程中的任何一点出现异常,Django将调用适当的错误处理视图。


 

示例
以下是一个URLconf示例:

 1 from django.conf.urls import url
 2 
 3 from . import views
 4 
 5 urlpatterns = [
 6 url(r^articles/2003/$, views.special_case_2003),
 7 url(r^articles/([0-9]{4})/$, views.year_archive),
 8 url(r^articles/([0-9]{4})/([0-9]{2})/$, views.month_archive),
 9 url(r^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$, views.article_detail),
10 ]

说明:
1. 要从URL捕获一个值,只需要将其括起来
2.没有必要添加一个主要的斜杠,因为每个URL都含有。例如^articles , 不是 ^/articles。
3.正则表达式前面的 ‘r‘ 是可选的,但是推荐使用。它告诉Python 这个字符串是一个‘raw‘(元字符串,字符串中没有任何内容被转义)

请求示例:
/articles/2005/03/    将匹配列表中的第三个条目。Django会调用views.month_archive(request, ‘2005‘, ‘03‘)函数

/articles/2005/3/      不会匹配其中的任何 URL模式 。因为第三个条目中 views.month_archive 月份需要两位数字。

/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} 只会匹配整数字符串。

 

以上是关于Djangon如何处理一个请求(How Django processes a request)的主要内容,如果未能解决你的问题,请参考以下文章

How Javascript works (Javascript工作原理) 内存管理及如何处理 4 类常见的内存泄漏问题

如何处理DataFrame中缺失项

C# 中的异常处理 - 如何处理?

如何处理预检请求?

Swift Alamofire 如何处理来自循环的所有请求

如何处理网络请求失败错误?