Django 之 自定义中间件
环境: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
Django 之 自定义中间件的更多相关文章
- (28)django的中间件(自定义中间件和防范跨站请求伪造攻击)-重要的概念
		Django中间件和中间件不是同一种东西 什么是中间件:中间件是一个很大的概念,只要程序和程序之间还有一层程序,用来处理两个程序的整个交互过程的请求.数据等等就叫中间件 Django中间件:是介于re ... 
- {Django基础九之中间件}  一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证
		Django基础九之中间件 本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学会了 ... 
- django系列8.1--django的中间件01 自定义中间件的5个方法
		一.Django中的中间件 Django中间件定义: Middleware is a framework of hooks into Django's request/response process ... 
- django 自定义中间件 middleware
		Django 中间件 Django中的中间件是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出.中间件的设计为开发者提供了一种无侵入式的开发方式,增强 ... 
- django 缓存、中间件、信号、CSRF 详解
		中间件 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 在django项 ... 
- Django中Middleware中间件
		Django中Middleware中间件 1 Middleware中间件概述 django中间middleware实质就是一个类,django会根据自己的规则在合适的时机执行中间件相应的方法.实际上当 ... 
- Django组件 之中间件
		-------------------------------------------------------------------落花不是无情物,待到山花烂漫时. 中间件 中间件的概念 中间件顾名 ... 
- Django框架之中间件与Auth
		Django框架之中间件与Auth模块一 cbv加装饰器 -先导入:from django.utils.decorators import method_decorator -1 可以在方法上加装饰器 ... 
- 基于django的自定义简单session功能
		基于django的自定义简单session功能 简单思路: 1.建立自定义session数据库 2.登入时将用户名和密码存入session库 3.将自定义的随机session_id写入cookie中 ... 
随机推荐
- PhotoSwipe中文API(一)
			入门 您应知道之前先做起事情: 1. PhotoSwipe不是一个简单的jQuery插件,至少基本的JavaScript知识才能安装. 2. PhotoSwipe需要预定义的图像尺寸(更多关于这一点) ... 
- requirements.txt
			在文件夹下 生成requirements.txt文件 pip freeze > requirements.txt 安装requirements.txt依赖 pip install -r requ ... 
- C题:A Water Problem(dp||搜索)
			原题链接 解法一:递归 #include<cstdio> #include<algorithm> using namespace std; long long n,x,y; l ... 
- ng-深度学习-课程笔记-9: 机器学习策略1(Week1)
			1 为什么要应用机器学习策略( Why is machine learning strategy ) 当你想优化一个问题的时候,通常可以有很多尝试(比如收集更多数据,增加迭代次数,改用adam,改变网 ... 
- url的正则表达式
			http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)? 
- Python笔记 #15# Pandas: Missing Data
			10 Minutes to pandas import pandas as pd import numpy as np import matplotlib.pyplot as plt dates = ... 
- Centos下给PHP一键升级高版本7.2.0
			我是在Centos下测试的,目前php版本是7.0.0,我要升级到php7.2.0,下面开始. 执行命令 # wget http://soft.vpser.net/lnmp/upgrade_php.s ... 
- Python3:pyecharts数据可视化插件
			Python3:pyecharts数据可视化插件 一.简介 pyecharts 是一个用于生成 Echarts 图表的类库. Echarts 是百度开源的一个数据可视化 JS 库.主要用于数据可视化. ... 
- vue.js指令v-model实现方法
			原文链接:http://www.jb51.net/article/99097.htm V-MODEL 是VUE 的一个指令,在input 控件上使用时,可以实现双向绑定. 通过看文档,发现他不过是一个 ... 
- 20145104张家明 《Java程序设计》第6周学习总结
			20145104张家明 <Java程序设计>第6周学习总结 教材学习内容总结 第10章与11章总结 标准输入输出 System.in: 标准输入,默认关联到键盘(终端输入) System. ... 
