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 ...
随机推荐
- jquery实现简易的计算器
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ReactNative之坑:停在gradle一直出点
问题: 初次安装好React Native 环境后,运行项目,会停留在下载 gradle 的界面一直出点 原因: 下载gradle一直不成功 解决方案: 可以根据提示的版本信息,手动下载,放在目录中, ...
- Boost内存池使用与测试
目录 Boost内存池使用与测试 什么是内存池 内存池的应用场景 安装 内存池的特征 无内存泄露 申请的内存数组没有被填充 任何数组内存块的位置都和使用operator new[]分配的内存块位置一致 ...
- Jquery 在ios上事件委托失效
点击通过js遍历出来的列表,跳转页面.点击事件委托在document上, 像这样: $(document).on("click",".nav",function ...
- SPI裸机驱动程序设计
1. SPI(Serial Peripheral Interface)串行外设接口,是一种高速的.全双工.同步的通信总线.采用主从模式(Master Slave)架构,支持多个slave,一般仅支持单 ...
- 基于两阶段提交的分布式事务实现(UP-2PC)
引言:分布式事务是分布式数据库的基础性功能,在2017年上海MySQL嘉年华(IMG)和中国数据库大会(DTCC2018)中作者都对银联UPSQL Proxy的分布式事务做了简要介绍,受限于交流形式难 ...
- vue中nextTick的使用(转载)
转载自:https://www.cnblogs.com/chaoyuehedy/p/8985425.html 简介 vue是非常流行的框架,他结合了angular和react的优点,从而形成了一个轻量 ...
- springboot 接口返回数据时 net.sf.json.JSONNull["empty"]) 异常
@ResetController返回数据时出现异常 Could not write JSON: Object is null; nested exception is com.fasterxml.ja ...
- Python学习 day15
一.内置函数(共68个) 1.作用域相关(2) locals(*args, **kwargs) -- 返回本地作用域中的所有名字 globals(*args, **kwargs) -- 返回全 ...
- Java - 二分法查找(尚学堂第七章数组)
import java.util.Arrays; public class TestBinarySearch { public static void main(String[] args) { in ...