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. vim编辑命令

    vi命令 命令模式: yy:复制 光标所在的这一行 4yy:复制 光标所在行开始向下的4行 p: 粘贴 dd:剪切 光标所在的这一行 2dd:剪切 光标所在行 向下 2行 D:从当前的光标开始剪切,一 ...

  2. 【CF598 Div3 F】Equalizing Two Strings

    一道通篇结论的傻逼题,被 lh 随手秒了 别告诉我你不会 Div3 的题,你肯定在 fake 没看过题解,以下做法纯属口胡,应该没问题 Description https://www.luogu.or ...

  3. GDB调试器教程

    启动和退出GDBGDB(GNU Project Debugger)几乎适用于所有类Unix系统,小巧方便且不失功能强大,Linux/Unix程序员经常用它来调试程序. 总的来说有几下几种方法启动GDB ...

  4. SPOJ 10707 COT2 - Count on a tree II

    思路 树上莫队的题目 每次更新(u1,u2)和(v1,v2)(不包括lca)的路径,最后单独统计LCA即可 代码 #include <cstdio> #include <cstrin ...

  5. MyBatis执行原理图

    作者:W&L 推荐: 陶邦仁的博客 (1)加载配置并初始化       触发条件:加载配置文件 配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信息加载成为一个个M ...

  6. LiteOS的内核——RTOS基本的特性

    在其他的rtos中,基本上也有类似的功能,ucos freertos,要是rtos的时候,务必选择自带的rtos功能,和裸机运行时有区别的

  7. MyEclipse运行项目出现 The user operation is waiting for "Building workspace" to complete

    如图所示 解决方式 1.选择菜单栏的“Project”,然后把菜单栏中“Build Automatically”前面的对钩去掉. 2.当你修改或添加代码后,选择菜单栏的“Project”,然后选择菜单 ...

  8. Makefile规则介绍

    Makefile 一个规则 三要素:目标,依赖,命令     目标:依赖 命令 1.第一条规则是用来生成终极目标的规则     如果规则中的依赖不存在,向下寻找其他的规则 更新机制:比较的是目标文件和 ...

  9. 最新版Google Chrome 自动加载flash插件的方法

    我们在用Selenium做自动化测试时,有时候需要浏览器自动加载flash插件,69以前的谷歌浏览器,可以通过加载属性的方法自动运行flash插件,如下: prefs={ "profile. ...

  10. sudo 问题:sorry, you must have a tty to run sudo

    写定时任务时候遇到 如下问题 To start backup... -- :: sudo: sorry, you must have a tty to run sudo The backup to c ...