Django源码解析(四) 中间件

Django源码解析(一) 开篇

Django源码解析(二) manage.py

Django源码解析(三) Django开发服务器,WSGI规范实现

Django源码解析(四) 中间件

Django源码解析(五) URL配置

 

Django中间件类型

Django的中间类型分为五种: 请求(Request)中间件,视图(View)中间件,模板(Template)中间件,响应(Response)中间件,异常(Exception)中间件.

特定的类型的中间件必须具有指定的方法.请求中间件必须具有process_request方法;视图中间件必须具有process_view方法;模板中间件必须具有process_template_response方法;Response必须具有process_response方法;异常中间件必须具有process_exception方法.可以存在一个类同时具有多个以上方法,即一个类可以同时是多种中间件.

中间件类必须使用无参__init__函数,创建类实例时,不需要任何参数.

 

中间件处理过程

1. 应用请求中间件,处理传入请求.如果请求中间件方法process_request返回的response非空,则终止处理过程,执行步骤7.

2. url匹配,查找视图函数.(下一章分析)

3. 应用视图中间件,处理传入请求 视图与视图参数.如果视图中间件方法process_view返回的response非空,则终止处理过程,执行步骤7.

4. 调用视图函数.

5. 如果视图函数抛出异常 ,应用异常中间件,处理传入请求与异常.如果异常中间件方法process_exception回的response非空,则终止处理过程.无论是否终止过程,都会跳到步骤7.

6. 如果response支持延迟渲染,应用模板中间件.(If the response supports deferred rendering, apply template response middleware and the render the response).执行步骤7.

7. 应用响应中间件,处理传入请求与中间件返回的response.

 

不同类型中间件的处理顺序

中间件的处理顺序指在settings.py中,MIDDLEWARE_CLASSES包含中间件的执行顺序.

添加中间件列表的执行代码:

if hasattr(mw_instance, 'process_request'):
    request_middleware.append(mw_instance.process_request)
if hasattr(mw_instance, 'process_view'):
    self._view_middleware.append(mw_instance.process_view)
if hasattr(mw_instance, 'process_template_response'):
    self._template_response_middleware.insert(0, mw_instance.process_template_response)
if hasattr(mw_instance, 'process_response'):
    self._response_middleware.insert(0, mw_instance.process_response)
if hasattr(mw_instance, 'process_exception'):
    self._exception_middleware.insert(0, mw_instance.process_exception)

怎么前两个中间件列表使用append方法添加,后面3个中间件列表使用insert方法添加呢? … 这样的目的是,控制传入动作的中间件执行顺序是从上到下,控制返回动作的中间件执行顺序是从下到上.即请求中间与视图中间件的执行顺序是从上到下,模板中间件 异常中间件与响应中间件的执行顺序是从下到上.

image

posted @ 2011-09-05 23:18  左奕  阅读(2685)  评论(2编辑  收藏  举报