[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中的中间件机制和执行顺序

原文来自 Understanding Django Middlewares, 这篇文章从整体上介绍了django中中间件定义,作用,和怎么样自己写中间件 –orangleliu。 注:middlew...
  • lzz957748332
  • lzz957748332
  • 2015年09月09日 15:40
  • 5585

分析Python的Django框架的运行方式及处理流程

之前在网上看过一些介绍Django处理请求的流程和Django源码结构的文章,觉得了解一下这些内容对开发Django项目还是很有帮助的。所以,我按照自己的逻辑总结了一下Django项目的运行方式和对R...
  • angel20082008
  • angel20082008
  • 2016年07月14日 15:47
  • 2604

[Django架构流程分析]Django框架架构总览

注:以下内容转载自 现代魔法学院 网站的 Django框架架构总览 一文,仅供学习使用。         Django 架构总览         如下图所示 django 的架构总览图,整体上...
  • dapeng0802
  • dapeng0802
  • 2015年11月11日 22:52
  • 1468

[Django架构流程分析]Django HTTP请求的处理流程

注:以下内容转载自 现代魔法学院 网站的 Django HTTP请求的处理流程 一文,仅供学习使用。         Django 和其他 Web 框架的 HTTP 处理的流程大致相同,Djang...
  • dapeng0802
  • dapeng0802
  • 2015年11月15日 21:53
  • 550

Django 中间件

转自:http://www.ziqiangxuetang.com/django/django-middleware.html 我们从浏览器发出一个请求 Request,得到一个响应后的内容 Http...
  • bluehawksky
  • bluehawksky
  • 2016年02月26日 17:04
  • 1058

Django编写中间件实现url自定义过滤

目前在公司内容,有一些项目需要接入安全登录认证。 而项目本身是基于Django的。 查阅一些资料后,发现一些比较好的方式是编写中间件(Middleware)。 本文主要讲解如何在Django项目...
  • laodengbaiwe0838
  • laodengbaiwe0838
  • 2017年08月12日 10:46
  • 298

Django源码分析--1

先上一个图,来看一下Django的结构,数据处理方向。 另外,Django所用的一个非常高级的python技术就是“元类”,所以在深入研究时需要了解这个东东。 先上图:...
  • shanzhizi
  • shanzhizi
  • 2015年12月24日 15:08
  • 1012

Django中间件

在有些场合,需要对Django处理的每个request都执行某段代码。这类代码可能是在view处理之前修改传入的request,或者记录日志信息以便于调试,等等。 这类功能可以用Django的中间件框...
  • wolaiye320
  • wolaiye320
  • 2016年07月26日 15:39
  • 1481

django 如何编写控制登录和访问权限控制的中间件

django中,很多时候我们都需要有一个地方来进行更加详细的权限控制,例如说哪些用户可以访问哪些页面,检查登录状态等,这里的话就涉及到了中间件的编写了。 在django项目下的setting.py文...
  • u011085172
  • u011085172
  • 2018年01月12日 15:15
  • 76

django处理流程分析

一、 处理过程的核心概念 如下图所示django的总览图,整体上把握以下django的组成: 核心在于中间件middleware,django所有的请求、返回都由中间件来完成。 ...
  • skyie53101517
  • skyie53101517
  • 2015年12月26日 17:56
  • 1835
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[Django架构流程分析]请求处理机制其二:Django中间件的解析
举报原因:
原因补充:

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