Django 之 自定义中间件
2024-08-28 15:36:17
环境: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
最新文章
- java学习流程
- wex5 实战 HeidiSQL 导入Excel数据
- JAVA-位运算符
- NOIP2014 行记
- 使用ssh无密码登录
- dhtmlx之dhtmlXGrid显示数据 --大数据
- 谈谈android反编译和防止反编译的方法(转)
- (转)linux service理解
- android fragment addToBackStack bug
- jquey(判断文本框输入的网址链接是否符合规则)
- 集群/分布式环境下5种session处理策略
- Java数据持久层框架 MyBatis之API学习十(Logging详解)
- Hibernate与Spring的事务管理
- nslookup和dig命令
- Global Illumination
- WPF背景透明内嵌WebBrowser不显示问题,即AllowsTransparency = true 和 Webbrowser 等控件显示冲突
- Django(命名URL和URL反向解析)
- Spring Cloud开发实践 - 01 - 简介和根模块
- 转载:windiws server 2008R2 IIS7.5 设置win7 IIS7设置,文件夹权限配置,Authenticated Users,支持asp temp
- 炫酷霸气的HTML5/jQuery应用及源码
热门文章
- Spring boot 开发WebService遇到的问题之一
- 在Marathon 上部署 cAdvisor + InfluxDB + Grafana Docker监控
- tar 压缩解压命令详解
- 找回 linux root密码的几种方法
- 3.5 Templates -- Binding Element Attributes(绑定元素属性)
- cocos代码研究(18)Widget子类Slider学习笔记
- Tomcat环境变量设置
- POJ 1062 昂贵的聘礼(最短路)题解
- Python学习札记(四十一) IO 1
- Python XML解析和处理