[Django架构流程分析]请求处理机制其二:Django中间件的解析

转载 2015年11月20日 23:23:45

        注:以下内容转载自 现代魔法学院 网站的 请求处理机制其二:Django中间件的解析 一文,仅供学习使用。

        Middleware 开始工作了

        get_response 做的第一件事就是遍历处理器的 _request_middleware 实例变量并调用其中的每一个方法,传入 HttpRequest 的实例作为参数。

for middleware_method in self._request_middleware:
	response = middleware_method(request)
	if response:
		break

        这些方法可以选择短路剩下的处理并立即让 get_response 返回,通过返回自身的一个值(如果它们这样做,返回值必须是 django.http.HttpResponse 的一个实例,后面会讨论到)。如果其中之一这样做了,我们会立即回到主处理器代码,get_response 不会等着看其它 middleware 类想要做什么,它直接返回,然后处理器进入 response 阶段。

        然而,更一般的情况是,这里应用的 middleware 方法简单地做一些处理并决定是否增加,删除或补充 request 的属性。

        URL Resolver 的解析

        假设没有一个作用于 request 的 middleware 直接返回 response,处理器下一步会尝试解析请求的 URL。它在配置文件中寻找一个叫做 ROOT_URLCONF 的配置,用这个配置加上根 URL /,作为参数来创建 django.core.urlresolvers.RegexURLResolver 的一个实例,然后调用它的 resolve 方法来解析请求的 URL 路径。

        URL resolver 遵循一个相当简单的模式。对于在 URL 配置文件中根据 ROOT_URLCONF 的配置产生的每一个在 urlpatterns 列表中的条目,它会检查请 求的 URL 路径是否与这个条目的正则表达式相匹配,如果是的话,有两种选择:

  1. 如果这个条目有一个可以调用的 include,resolver 截取匹配的 URL,转到 include 指定的 URL 配置文件并开始遍历其中 urlpatterns 列表中的每一个条目。根据你 URL 的深度和模块性,这可能重复好几次。
  2. 否则,resolver 返回三个条目:
  • 匹配的条目指定的 view function;
  • 一个从 URL 得到的未命名匹配组(被用来作为 view 的位置参数);
  • 一个关键字参数字典,它由从 URL 得到的任意命名匹配组和从 URLConf 中得到的任意其它关键字参数组合而成。

        注意这一过程会在匹配到第一个指定了 view 的条目时停止,因此最好让你的 URL 配置从复杂的正则过渡到简单的正则,这样能确保 resolver 不会首先匹配到简单的那一个而返回错误的 view function。

        如果没有找到匹配的条目,resolver 会产生 django.core.urlresolvers.Resolver404 异常,它是 django.http.Http404 例外的子类。后面我们会知道它是如何处理的。

# Apply view middleware
for middleware_method in self._view_middleware:
	response = middleware_method(request, callback, callback_args, callback_kwargs)
	if response:
		break

        一旦知道了所需的 view function 和相关的参数,处理器就会查看它的 _view_middleware 列表,并调用其中的方法,传入 HttpRequst,view function,针对这个 view 的位置参数列表和关键字参数字典。

        还有,Middleware 有可能介入这一阶段并强迫处理器立即返回。

相关文章推荐

[Django架构流程分析]请求处理机制其一:进入Django前的准备

注:以下内容转载自 现代魔法学院 网站的 请求处理机制其一:进入Django前的准备 一文,仅供学习使用。         一个 Request 到达了!         首先发生的是一些和 ...

Django中间件实现拦截器

1.前言JavaWeb Struts2的拦截器我们都能很熟悉,在请求交给Action处理之前,先在拦截器中处理,处理完之后再交给Action。 在Django中如何实现相同的效果?2.Django中...
  • huplion
  • huplion
  • 2016年10月02日 13:34
  • 2429

django 自定义auth的中间件的验证

今天在做django的用户验证这块的功能,想用django自带的auth的验证等现有的方法。从网上查到,auth的使用,详见:http://my.oschina.net/u/569730/blog/3...

Django的中间件

Django的中间件 Django对于中间件的定义为: 中间件是用来处理请求和响应的插件机制,用来全局的处理Django的输入输出。 每一个中间件都会有自己专门的功能。 激活中...
  • IT_YUAN
  • IT_YUAN
  • 2017年06月07日 17:07
  • 366

Django-中间件Middleware

Django-中间件 Djano中间件流程 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行...

Django教程笔记:六、中间件middleware

中间件介绍中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能...

Django 中间件的研究

闲来无事,看到MIDDLEWARE 这个列表,想一探究竟 先上几个参考链接: 涂伟忠自强学堂 戳这里这篇博客 官网文档中间件 开篇 中间件是什么?中间件的本质是一个类实例对象或者一个函数对象,这些对象...
  • babados
  • babados
  • 2017年07月29日 13:57
  • 301

django用jquery的ajax提交表单,中间件的CsrfViewMiddleware问题

首先要引入jquery文件。 注意这句是要添加到自己写的jquery脚本前边。 然后写一个简单的表单 {% csrf_token %} 用户名 ...

django数据库操作和中间件

http://cache.baiducontent.com/c?m=9d78d513d99701f207fa940f5b4e843a4c0997624cc0d06268d5e31ec3735a3150...

Django 内建 中间件组件

中间件 这篇文档介绍了Django自带的所有中间件组件。 要查看关于如何使用它们以及如何编写自己的中间件,请见中间件使用指导。 可用的中间件 缓存中间件 class Updat...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[Django架构流程分析]请求处理机制其二:Django中间件的解析
举报原因:
原因补充:

(最多只允许输入30个字)