django中间件
跨站请求伪造
中间件的执行顺序从上往下的读
1 | MIDDLEWARE = [ # 从上往下的读 |
新建一个文件middleware.py
与这个文件代码顺序无关
1 | from django.utils.deprecation import MiddlewareMixin |
process_request 执行顺序从上往下
请求来的时候,会响应它
1 | http://127.0.0.1:8000/test_middle/?name=shouyue |
1 | from django.utils.deprecation import MiddlewareMixin |
process_response 执行顺序从下往上
响应回去的时候,会走它
错误示范
1 | from django.utils.deprecation import MiddlewareMixin |
报错
1 | if response.get('X-Frame-Options') is not None: |
原因
1 | # wiews.py文件第一次返回响应 |
正确方案
需要在process_response写return response
1 | from django.utils.deprecation import MiddlewareMixin |
将响应里面加cookie
1 | from django.utils.deprecation import MiddlewareMixin |
流程图

有意思的事情来了
测试一MyMiddleware1中间件
MyMiddleware2和视图函数被过滤掉了
1 | from django.utils.deprecation import MiddlewareMixin |
测试二MyMiddleware1中间件 process_request返回的默认是None
1 | from django.utils.deprecation import MiddlewareMixin |
结果
1 | MyMiddleware--------request1-------> |
测试三MyMiddleware2中间件
视图函数被过滤掉了
1 | from django.utils.deprecation import MiddlewareMixin |
结果
1 | MyMiddleware--------request1-------> |
process_view
request, callback(视图函数), callback_args(无名分组的参数), callback_kwargs(有名分组的参数)
流程图

测试跳过MyMiddleware2的process_view
1 | from django.utils.deprecation import MiddlewareMixin |
作用
捕获异常直接返回
将视图函数写一个异常
1 | from django.shortcuts import render,HttpResponse |
middleware.py的process_exception
1 | from django.utils.deprecation import MiddlewareMixin |
流程

def process_exception(self, request, exception)(了解)
def process_template_response(self, request, response):(了解)
process_template_response
作用自动调用返回对象的render方法
views.py
1 | class Test(): |
middleware.py的process_template_response
1 | from django.utils.deprecation import MiddlewareMixin |