首页 > 科技 > Django是如何处理请求的?URL调度详细解析

Django是如何处理请求的?URL调度详细解析

在Django学习过程中,对于初学者来说,关于URL路由最为容易迷惑,本篇只针对该内容,做详细讲解。(Django版本的不同,url配置文件有所不同,以下为Django 2以上版本中)

Django如何处理请求

在了解学习URL路由转发之前,先了解一下Django是如何处理请求的。

当我们从Django web服务站点请求一个页面时,系统按照以下算法来确定执行哪段Python代码:

1. Django确定要使用的root URLconf模块。可以通过项目settings文件中配置ROOT_URLCONF(当然还有其他情况,配置的ROOT_URLCONF,另行考虑)。

通过项目settings文件中配置ROOT_URLCONF

2. Django加载Python模块并查找变量urlpatterns。这应该是一个django.url.path()和/或django.url.re_path()实例的序列。

3. Django会按顺序去遍历每个URL pattern,并在第一个匹配到请求的URL的pattern处停止。

4. 一旦其中一个URL pattern匹配,Django就会导入并调用给定的视图,该视图是一个简单的Python函数(或基于类的视图)。视图通过以下参数传递:

  • HttpRequest的一个实例。
  • 如果匹配的URL模式没有返回指定的组,那么正则表达式中的匹配将作为位置参数提供。
  • 关键字参数由路径表达式匹配的任何命名部分组成,由可选的kwargs参数(django.url .path()或django.url .re_path()中指定的任何参数覆盖。

Django处理请求过程

URL配置文件解析

例如,这里有个URL配置文件

from django.urls import path
from . import views
urlpatterns = [
ttpath('articles/2003/', views.special_case_2003),
ttpath('articles//', views.year_archive),
ttpath('articles///', views.month_archive),
ttpath('articles////', views.article_detail),
]
  • 要想从URL捕获值,在path()方法中是使用"<>"来实现的。
  • 捕获的值可以定义转换器类型。例如,使用来捕获一个整数参数。如果没有包含转换器,则匹配除/字符之外的任何字符串。
  • 不需要添加前导斜杠,因为每个URL都有。例如,它是articles,而不是/articles。

转换器有几种类型

  1. str:匹配任何非空字符串,不包括路径分隔符'/'。如果表达式中没有包含转换器,str就是默认的。
  2. int:匹配0或任何正整数。返回一个int。
  3. slug:匹配任何由ASCII字符或数字,加上连字符和下划线字符组成的slug字符串。例如,building-your-1st-django-site。
  4. uuid:匹配格式化的uuid。为了防止多个url映射到同一个页面,必须包含破折号和小写字母。例如,075194d3-6885-417-e-a8a8c931e272f0-6。返回一个UUID实例。
  5. path:匹配任何非空字符串,包括路径分隔符'/'。这允许您匹配一个完整的URL路径,而不是像str那样只匹配URL路径的一部分。

URLconf搜索的是什么?

URLconf以常规Python字符串的形式对请求的URL进行搜索。这并不包括GET或POST参数或域名。

  • 例如,在对https://www.example.com/articles/的请求中,URLconf将查找articles/。在https://www.example.com/articles/?page=3,URLconf将查找articles/。
  • URLconf不查看请求方法。换句话说,所有请求方法(POST、GET、HEAD等)都将被路由到相同的URL的相同函数。

URL中主要函数解释

include()

include(module, namespace=None)[source]¶
include(pattern_list)
include((pattern_list, app_namespace), namespace=None)

配置路径,从而导入另一个URLconf模块的函数。还可以指定包含条目的应用程序名称和实例名称。就相当于多级路由,它把接收到的url地址去除与此项匹配的部分,将剩下的字符串传递给下一级路由urlconf进行判断。

通常,应用程序名称应该由包含的模块指定。如果设置了应用程序名称,则可以使用参数设置不同的实例名称。

include()还接受一个参数,要么是返回URL模式的iterable,要么是包含此类iterable和应用程序名称的二元组。

参数解释:
module – URLconf module (或模块名称)
命名(str)——包含URL条目的实例名称
pattern_list—可迭代的path()和/或re_path()实例。
app_namespace (str)——包含URL条目的应用程序名称

path()或url()

path(route, view, kwargs=None, name=None)

路由系统中最重要的path()方法可以接收4个参数,其中2个是必须的:route和view,以及2个可选的参数:kwargs和name。

  1. route 是一个匹配 URL 的准则(类似正则表达式)。当 Django 响应一个请求时,它会从 urlpatterns 的第一项开始,按顺序依次匹配列表中的项,直到找到匹配的项,然后执行该条目映射的视图函数或下级路由,其后的条目将不再继续匹配。因此,url路由的编写顺序非常重要!
  2. view指的是处理当前url请求的视图函数。当Django匹配到某个路由条目时,自动将封装的HttpRequest对象作为第一个参数,被"捕获"的参数以关键字参数的形式,传递给该条目指定的视图view。
  3. kwargs参数允许您向视图函数或方法传递额外的参数。
  4. name是对你的URL进行命名,让你能够在Django的任意处,尤其是模板内显式地引用它。这是一个非常强大的功能,相当于给URL取了个全局变量名,不会将url匹配地址写死。

本文来自投稿,不代表本人立场,如若转载,请注明出处:http://www.souzhinan.com/kj/218596.html