环境:django:1.10    python: 2.7

简介

中间件是一个轻量级、底层的插件系统,可以介入 django 的请求和响应处理过程,修改 django 的输入和输出。

在 django 1.10(不包含)以前每个中间件是一个独立的python类,在 django1.10 以后需要继承 MiddlewareMixin(django 1.10后也可以写成函数,这里不考虑)。

每个中间件可以包含以下几个方法中的一个或多个:

__init__()、__call__()[django 1.10及以上]、process_request()、process_view()、process_template_response()、process_response()、process_exception().

示例:

在app目录下新建文件,名字随意,内容如下:

 # coding: utf-8
from django.http import HttpResponse
try:
from django.utils.deprecation import MiddlewareMixin # Django 1.10.x
except ImportError:
MiddlewareMixin = object # Django 1.4.x - Django 1.9.x class MyMiddleware(MiddlewareMixin):
def __init__(self, get_response):
self.get_response = get_response
# One-time configuration and initialization. def __call__(self, request):
'''相当于process_view 和 proce_template_response 的合体
适用1.10以上的版本'''
# 调用 view 之前的代码,
print 'view before----------'
response = self.get_response(request)
print 'view after----------'
# 调用 view 之后的代码
return response def process_request(self, request):
'''在urls.py之前调用,返回None或时HttpResponse对象'''
print 'urls before----------'
pass def process_view(self, request, view_func, view_args, view_kwargs):
'''在views.py之前调用,返回None或时HttpResponse对象'''
print 'view1 before----------'
pass
32
def process_exception(self, request, exception):
'''在views.py中出现异常时被调用,返回None或时HttpResponse对象
注意:404错误属于url的异常,这里不能被捕捉到
各个版本通用'''
print 'exception before----------'
return HttpResponse(exception.message) def process_template_response(self, request, response):
'''views.py 之后,渲染模板之前执行
返回实现了render方法的响应对象'''
print 'views after template before----------'
pass

def process_response(self, request, response):
'''在模板渲染完,返回浏览器前调用,
返回 HttpResponse 或 StreamingHttpResponse 对象'''
print 'template after----------'
return HttpResponse('template after----------')

激活:

在 settings.py 文件的 MIDDLEWARE(老版本MIDDLEWARE_CLASS)中添加:

'app名称.中间件文件名.中间件类名'   # 中间用 “.” 相联

执行顺序:

  • 若没有__call__()方法,按下图来执行:

  • 若有__call__()方法,则只执行process_view()和process_response()方法:

__call__()的源码如下:

 class MiddlewareMixin(object):
def __init__(self, get_response=None):
self.get_response = get_response
super(MiddlewareMixin, self).__init__() def __call__(self, request):
response = None
if hasattr(self, 'process_request'):
response = self.process_request(request)
if not response:
response = self.get_response(request)
if hasattr(self, 'process_response'):
response = self.process_response(request, response)
return response

最新文章

  1. java学习流程
  2. wex5 实战 HeidiSQL 导入Excel数据
  3. JAVA-位运算符
  4. NOIP2014 行记
  5. 使用ssh无密码登录
  6. dhtmlx之dhtmlXGrid显示数据 --大数据
  7. 谈谈android反编译和防止反编译的方法(转)
  8. (转)linux service理解
  9. android fragment addToBackStack bug
  10. jquey(判断文本框输入的网址链接是否符合规则)
  11. 集群/分布式环境下5种session处理策略
  12. Java数据持久层框架 MyBatis之API学习十(Logging详解)
  13. Hibernate与Spring的事务管理
  14. nslookup和dig命令
  15. Global Illumination
  16. WPF背景透明内嵌WebBrowser不显示问题,即AllowsTransparency = true 和 Webbrowser 等控件显示冲突
  17. Django(命名URL和URL反向解析)
  18. Spring Cloud开发实践 - 01 - 简介和根模块
  19. 转载:windiws server 2008R2 IIS7.5 设置win7 IIS7设置,文件夹权限配置,Authenticated Users,支持asp temp
  20. 炫酷霸气的HTML5/jQuery应用及源码

热门文章

  1. Spring boot 开发WebService遇到的问题之一
  2. 在Marathon 上部署 cAdvisor + InfluxDB + Grafana Docker监控
  3. tar 压缩解压命令详解
  4. 找回 linux root密码的几种方法
  5. 3.5 Templates -- Binding Element Attributes(绑定元素属性)
  6. cocos代码研究(18)Widget子类Slider学习笔记
  7. Tomcat环境变量设置
  8. POJ 1062 昂贵的聘礼(最短路)题解
  9. Python学习札记(四十一) IO 1
  10. Python XML解析和处理