Django—middleware
一、Django中间件的请求周期
我们从浏览器发出一个请求 Request,得到一个响应后的内容 HttpResponse ,这个请求传递到 Django的过程如下:

也就是说,每一个请求都是先通过中间件中的 process_request 函数,这个函数返回 None 或者 HttpResponse 对象,如果返回前者,继续处理其它中间件,如果返回一个 HttpResponse,就处理中止,返回到网页上。
二、自定义及注册中间件
1. 创建中间件
在project根目录下创建中间件py文件:
class RequestExeute(object):
def process_request(self, request):
print('process_request') def process_view(self, request, callback, callback_args, callback_kwargs):
print('process_view') def process_exception(self, request, exception):
"""
当views函数出错时执行
:param request:
:param exception:
:return:
"""
print('process_exception') def process_response(self, request, response):
"""
必须return HttpResponse
:param request:
:param response:
:return:
"""
print('process_response')
return response def process_template_response(self, request, response):
"""
视图函数的返回值中,如果有render方法,才被调用
:param request:
:param response:
:return:
"""
print('process_template_response')
return response
md.py
2. 注册中间件
在settings.py文件中,按照欲执行的顺序注册:

ps. 在1.9及之前的版本中,中间件的关键字为:MIDDLEWARE_CLASSES
MIDDLEWARE_CLASSES = (
'zqxt.middleware.BlockedIpMiddleware',
...其它的中间件
)
三、中间件中方法的执行顺序
1. 正常状况
from django.shortcuts import HttpResponse
from django.utils.deprecation import MiddlewareMixin
class M1(MiddlewareMixin):
def process_request(self, request):
print('m1.request')
# return HttpResponse('request_m1') def process_view(self, request, callback, callback_args, callback_kwargs):
print('m1.view')
# response = callback(request, *callback_args, **callback_kwargs)
# return response def process_response(self, request, response):
print('m1.response')
return response def process_exception(self, request, exception):
print('m1.process_exception')
return HttpResponse('m1.process_exception') def process_template_response(self, request, response):
"""
视图函数的返回值中,如果有render方法,才被调用
:param request:
:param response:
:return:
"""
print('m1.process_template_response')
return response class M2(MiddlewareMixin):
def process_request(self, request):
print('m2.request') def process_view(self, request, callback, callback_args, callback_kwargs):
print('m2.view')
# response = callback(request, *callback_args, **callback_kwargs)
# return response def process_response(self, request, response):
print('m2.response')
return response def process_exception(self, request, exception):
print('m2.process_exception')
return HttpResponse('m2.process_exception') def process_template_response(self, request, response):
"""
视图函数的返回值中,如果有render方法,才被调用
:param request:
:param response:
:return:
"""
print('m2.process_template_response')
return response
process_request和process_view返回None
执行顺序:
- m1.request
- m2.request
- m1.view
- m2.view
- m2.response
- m1.response
2. 在版本1.10及之后
若process_request返回HttpResponse 对象,则从当前中间件的process_response向前返回
from django.shortcuts import HttpResponse
from django.utils.deprecation import MiddlewareMixin
class M1(MiddlewareMixin):
def process_request(self, request):
print('m1.request')
return HttpResponse('request_m1') def process_view(self, request, callback, callback_args, callback_kwargs):
print('m1.view')
# response = callback(request, *callback_args, **callback_kwargs)
# return response def process_response(self, request, response):
print('m1.response')
return response def process_exception(self, request, exception):
print('m1.process_exception')
return HttpResponse('m1.process_exception') def process_template_response(self, request, response):
"""
视图函数的返回值中,如果有render方法,才被调用
:param request:
:param response:
:return:
"""
print('m1.process_template_response')
return response class M2(MiddlewareMixin):
def process_request(self, request):
print('m2.request') def process_view(self, request, callback, callback_args, callback_kwargs):
print('m2.view')
# response = callback(request, *callback_args, **callback_kwargs)
# return response def process_response(self, request, response):
print('m2.response')
return response def process_exception(self, request, exception):
print('m2.process_exception')
return HttpResponse('m2.process_exception') def process_template_response(self, request, response):
"""
视图函数的返回值中,如果有render方法,才被调用
:param request:
:param response:
:return:
"""
print('m2.process_template_response')
return response # class RequestExeute(object):
# def process_request(self, request):
# print('process_request')
#
# def process_view(self, request, callback, callback_args, callback_kwargs):
# print('process_view')
#
# def process_exception(self, request, exception):
# """
# 当views函数出错时执行
# :param request:
# :param exception:
# :return:
# """
# print('process_exception')
#
# def process_response(self, request, response):
# """
# 必须return HttpResponse
# :param request:
# :param response:
# :return:
# """
# print('process_response')
# return response
#
# def process_template_response(self, request, response):
# """
# 视图函数的返回值中,如果有render方法,才被调用
# :param request:
# :param response:
# :return:
# """
# print('process_template_response')
# return response
M1的process_request返回HttpResponse
执行顺序:
- m1.request
- m1.response
process_view与process_request类似:
from django.shortcuts import HttpResponse
from django.utils.deprecation import MiddlewareMixin
class M1(MiddlewareMixin):
def process_request(self, request):
print('m1.request')
# return HttpResponse('request_m1') def process_view(self, request, callback, callback_args, callback_kwargs):
print('m1.view')
response = callback(request, *callback_args, **callback_kwargs)
return response def process_response(self, request, response):
print('m1.response')
return response def process_exception(self, request, exception):
print('m1.process_exception')
return HttpResponse('m1.process_exception') def process_template_response(self, request, response):
"""
视图函数的返回值中,如果有render方法,才被调用
:param request:
:param response:
:return:
"""
print('m1.process_template_response')
return response class M2(MiddlewareMixin):
def process_request(self, request):
print('m2.request') def process_view(self, request, callback, callback_args, callback_kwargs):
print('m2.view')
# response = callback(request, *callback_args, **callback_kwargs)
# return response def process_response(self, request, response):
print('m2.response')
return response def process_exception(self, request, exception):
print('m2.process_exception')
return HttpResponse('m2.process_exception') def process_template_response(self, request, response):
"""
视图函数的返回值中,如果有render方法,才被调用
:param request:
:param response:
:return:
"""
print('m2.process_template_response')
return response
m1的process_view返回HttpResponse
执行顺序:
- m1.request
- m2.request
- m1.view
- m2.response
- m1.response
3. 在版本1.10之前
若process_request返回HttpResponse 对象,则当前中间件之后的process_request都不会执行,而从最后一个中间件的process_response向前返回
参考资料:
2. http://code.ziqiangxuetang.com/django/django-middleware.html
Django—middleware的更多相关文章
- Django Middleware简介
1 前言 Django使用非常熟练了,各种API接口不在话下,全都搞定.为方便定位问题在每个API接口的的开始和返回的地方都加上了log打印,记录入参和返回值. 但是这样有一个问题,需要每个 ...
- Django MiddleWare初识
一.Django 中间件介绍 中间件是一个用来处理Django的请求和响应的框架级别的钩子.它是一个轻量.低级别的插件系统,用于在全局范围内改变Django的输入和输出.每个中间件组件都负责做一些特定 ...
- Django 中CSRF中间件 'django.middleware.csrf.CsrfViewMiddleware',
1.Django中CSRF中间件的工作原理及form表单提交需要添加{% csrf_token %}防止出现403错误 CSRF # 表示django全局发送post请求均需要字符串验证功能:防止跨站 ...
- Django middleware (中间件)
关于中间价: django 中的中间件其实就是一个类,在请求到来和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法. 在django项目的settings中,有一个 MIDDLE ...
- django middleware介绍
Middleware Middleware是一个镶嵌到django的request/response处理机制中的一个hooks框架.它是一个修改django全局输入输出的一个底层插件系统. 每个中间件 ...
- 【转】Django Middleware
Django 处理一个 Request 的过程是首先通过中间件,然后再通过默认的 URL 方式进行的.我们可以在 Middleware 这个地方把所有Request 拦截住,用我们自己的方式完成处理以 ...
- Django Middleware 之 SessionMiddleware
Django版本:1.7.11 先放源码: class SessionMiddleware(object): def __init__(self): engine = import_module(se ...
- Django分析之Middleware中间件
写了几周的脚本,今天终于开始接触web框架了~学习Python的web框架,那么Django就几乎是必修课了,这次的工作是先打打下手,主要的任务是在setting中添加版本号,在渲染静态css,js的 ...
- Django 源码小剖: 初探中间件(middleware)
因为考虑到文章的长度, 所以 BaseHandler 的展开被推迟了. 在 BaseHandler 中隐藏着中间件的信息, 较常见的 SessionMiddleware 就已经默认安装. BaseH ...
随机推荐
- 时间超限问题处理(c++)
c++中 如果时间超上限 做题上: 考虑关于二进制的方法 比如说 find your present (2) 这道题 可以用异或运算 来发现不重复数 对于动态规划 状态压缩发面 方面应用更多 比如说p ...
- js高级程序设计 笔记 --- 引用类型
一,变量和作用域 1, js变量可以保存两种类型,基本类型.引用类型和symbol类型,基本类型有5种:undefined.null.boolean.number.string,它们都有以下的特征 基 ...
- Locust 类的使用
HttpLocust类 可定义多个HttpLocust类,即多个用户可执行不同的任务或者相同的任务,但是执行频率不一样,用weight进行约定. # coding:utf-8 from locust ...
- CDH集群安装配置(三)- 集群时间同步(主节点)和 免密码登录
集群时间同步(主节点) 1. 查看是否安装ntp服务,如果没有安装 rpm -qa |grep ntpd查看命令 yum install ntp安装命令 2. 修改配置 vi /etc/ntp.con ...
- wiz笔记
分享本地的wiz笔记到网上 , 成为博客 博客园 http://www.cnblogs.com/您的博客名称/services/metablogapi.aspx // region 图片里面的字段:从 ...
- line-height详解
line-height详解 要说line-height就必须要知道这几个概念了: 顶线.中线.基线.底线. 这也就是在vertical-align中可能用到的top,middle,baseline和b ...
- select for update和select for update wait和select for update nowait的区别
CREATE TABLE "TEST6" ( "ID" ), "NAME" ), "AGE" ,), "SEX ...
- [Unity3D]Shader编程之动态屏幕遮罩
转载 https://blog.csdn.net/u012741077/article/details/78425834 屏幕可视范围跟随目标物体移动,可修改可视范围大小,边缘渐变大小.以及遮罩颜色, ...
- MySQL移动数据目录出现权限问题
MySQL移动数据目录出现权限问题 环境: ubuntu 14.04.4 LTS 现象 今天把/var/lib/mysql下的数据文件移动到其他目录下,之后发现启动mysql报错,并且mysql无法运 ...
- ImportError: cannot import name wordnet
ubuntu安装好nltk,调用时,出现问题: 解决: Install Setuptools: http://pypi.python.org/pypi/setuptools Install Pip: ...