Django处理请求的流程

  1. Django确定要使用的根URLconf模块。通常,这是ROOT_URLCONF设置的值,但如果传入 HttpRequest对象具有urlconf 属性(由中间件设置),则将使用其值代替 ROOT_URLCONF设置。
  2. Django加载Python模块并查找变量urlpatterns。这应该是一个django.urls.path的序列()或django.urls.re_path()实例。
  3. Django按顺序遍历每个URL模式,并在匹配请求的URL的第一个模式停止。
  4. 如果成功匹配到其中一个URL模式,Django就会导入并调用给定的视图。
  5. 如果没有URL模式匹配,或者在此过程中的任何点期间引发异常,Django将调用适当的错误处理视图。

path()

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

  • route:应该是一个字符串,其中包含一个URL模式;按顺序依次匹配列表中的项,直到找到匹配的项;
  • view:相对应的视图;
  • kwargs:任意个关键字参数可以作为一个字典传递给目标视图;
  • name:为你的URL取名能使你在Django的任意地方唯一地引用它,尤其是在模板中。这个有用的特性允许你只改一个文件就能全局地修改某个URL模式。

还可以从URL捕获数据,使用尖括号<数据类型: 参数名>,捕获的值可以选择数据类型。

当匹配到这个URL时,尖括号所匹配的内容会赋给定义的参数,然后传递给对应的视图,并且视图中必须添加相同名称的参数。

例如请求/articles/2005/03/与列表中的第三个条目匹配。Django会调用该函数views.month_archive(request, year=2005,month=3, content='ahhh')

from django.urls import path
from . import views urlpatterns = [
path('articles/2003/', views.special_case_2003),
path('articles/<int:year>/', views.year_archive),
path('articles/<int:year>/<int:month>/', views.month_archive, {'content': 'ahhh'}),
path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
]

正则表达式

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

  • route:应该是一个字符串,其中包含与Python的兼容的正则表达式re模块,字符串通常使用原始字符串语法(r' ');
  • view, kwargs, name:与path()一样。
from django.urls import path, re_path
from . import views urlpatterns = [
path('articles/2003/', views.special_case_2003),
re_path(r'^articles/[0-9]{4}/$', views.year_archive),
re_path(r'^articles/[0-9]{4}/[0-9]{2}/$', views.month_archive),
]

1、命名参数

通过(?P<name>pattern)可以从URL获取数据,name组的名称,并且 pattern是要匹配的模式。

当匹配到相关URL时,pattern匹配到的内容作为值赋给name,然后传递给视图。并且视图中必须添加相同键名的参数。

例如请求/articles/2005/03/与列表中的第三个条目匹配。Django会调用该函数views.month_archive(request, year=2005,month=3)

urlpatterns = [
path('articles/2003/', views.special_case_2003),
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
]

2、无名参数

通过(pattern)可以从URL获取数据,不设置组名<name>,将pattern匹配到的内容直接传入给视图,视图必须添加相对应数量的位置参数。

不特别推荐这种用法,因为它更容易在匹配的预期含义和视图的参数之间意外引入错误。

urlpatterns = [
re_path(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
]

在任何一种情况下,建议在给定的正则表达式中仅使用一种样式。当两种样式混合使用时,将忽略任何未命名的组,并且只将命名组传递给视图函数。

include(module,namespace = None)

  • module - URLconf模块(或模块名称)
  • namespace(str) - 包含的URL条目的实例名称空间

例如请求/blog/about/与inner中的第二个条目匹配。Django会调用该函数views.about(request, blog_id=3)

# main.py
from django.urls import include, path urlpatterns = [
path('blog/', include('inner'), {'blog_id': 3}), #inner中的每一行都会被传入{'blog_id': 3}的参数
] # inner.py
from django.urls import path
from mysite import views urlpatterns = [
path('archive/', views.archive),
path('about/', views.about),
]

只要在include层级传入自定义参数,那么子URLconf中每一条path都会被传入自定义参数,那么就确定每个视图也都设置了对应的参数。

Django URL调度器的更多相关文章

  1. Django 源码小剖: URL 调度器(URL dispatcher)

    在刚开始接触 django 的时候, 我们尝试着从各种入门文档中创建一个自己的 django 项目, 需要在 mysite.urls.py 中配置 URL. 这是 django url 匹配处理机制的 ...

  2. Django 源码小剖: 更高效的 URL 调度器(URL dispatcher)

    效率问题 django 内部的 url 调度机制说白了就是给一张有关匹配信息的表, 这张表中有着 url -> action 的映射, 当请求到来的时候, 一个一个(遍历)去匹配. 中, 则调用 ...

  3. URL 调度器(URL dispatcher)

    URL 调度器(URL dispatcher) 在刚开始接触 django 的时候, 我们尝试着从各种入门文档中创建一个自己的 django 项目, 需要在 mysite.urls.py 中配置 UR ...

  4. django url注册器组件, 响应器组件, 分页器组件

    一.url注册器的使用 1.1导入模块 from django.urls import re_path, include from .serializer import views from rest ...

  5. django url调度

    Django的url配置相同遵循着DRY(dont repeat yourself)的规则.下面都是官方文档的样例: 首先介绍的是Django怎样处理http的请求: 1.在setting里定义ROO ...

  6. Django url分发器

    视图: 视图一般都写在app的views.py中.并且视图的第一个参数永远都是request(一个HttpRequest)对象.这个对象存储了请求过来的所有信息,包括携带的参数以及一些头部信息等.在视 ...

  7. 02-URLConf调度器

    1.工作原理 django通过urlconf来映射视图函数,只区分路径,不区分http方法 Django确定要使用的根URLconf模块,一般是在settings中的ROOT_URLCONF设置的值. ...

  8. python爬虫主要就是五个模块:爬虫启动入口模块,URL管理器存放已经爬虫的URL和待爬虫URL列表,html下载器,html解析器,html输出器 同时可以掌握到urllib2的使用、bs4(BeautifulSoup)页面解析器、re正则表达式、urlparse、python基础知识回顾(set集合操作)等相关内容。

    本次python爬虫百步百科,里面详细分析了爬虫的步骤,对每一步代码都有详细的注释说明,可通过本案例掌握python爬虫的特点: 1.爬虫调度入口(crawler_main.py) # coding: ...

  9. DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件

    DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件   本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...

随机推荐

  1. 一图一知-NPM&YARN常用命令

  2. Linux的基础使用命令

    ifconfig  #查看ip地址     或者使用  ip  a pwd  #查看当前工作路径 man  pwd   #查看命令的详细信息   按q退出 mkdir  /data  创建data目录 ...

  3. Mac&Appium&Python自动化测试-环境搭建之安卓SDK

    一.摘要 本博文将详细讲述在Mac环境下的jdk安装.配置以及环境校验:安卓sdk安装.配置以及环境校验 二.安装包工具准备: jdk1.8.0(64 位) android-sdk_r24.4.1-m ...

  4. ShedLock日常使用

    首发于个人博客:ShedLock日常使用 场景模拟 定时器Scheduler在平时使用比较频繁,比如定时数据整理,定时向客户发送问候信息等...,定时任务的配置比较简单,比如在springboot中, ...

  5. 表单重置时 <input type=“hidden”> 隐藏域不可被重置

    可封装全局样式 .hide{ display:none; } 用 <input type="text" class="hide"/> 替代

  6. [SCOI2016]美味——主席树+按位贪心

    原题戳这里 题解 让异或值最大显然要按位贪心,然后我们还发现加上一个\(x_i\)的效果就是所有\(a_i\)整体向右偏移了,我们对于\({a_i}\)开个主席树,支持查询一个区间中有多少个在\([L ...

  7. 单例模式(Singleton)的同步锁synchronized

    单例模式,有“懒汉式”和“饿汉式”两种. 懒汉式 单例类的实例在第一次被引用时候才被初始化. public class Singleton { private static Singleton ins ...

  8. elementUI el-date-picker 时间范围设置 固定时间段可选 配置

    https://blog.csdn.net/sinat_37255207/article/details/91793889 <el-date-picker v-model="start ...

  9. POI做题笔记

    POI2011 Conspiracy (2-SAT) Description \(n\leq 5000\) Solution 发现可拆点然后使用2-SAT做,由于特殊的关系,可以证明每次只能交换两个集 ...

  10. Luogu P5022 旅行 搜索+贪心

    好吧...一直咕..现在才过...被卡常卡到爆... 写的垃圾版本,$n^2$无脑删边..可以发现走出来的是棵树...更优秀的及数据加强版先咕着...一定写.qwq #include<cstdi ...