中间件
功能作用
1. 介于 request 与 response 处理之间的一道处理过程, 并且在全局上改变 django 的输入与输出.
2. 修改请求. 例如被传送到 view 中的 HttpRequest 对象. 或者想修改 view 返回的 HttpResponse 对象, 这些都可以通过中间件来实现.
3. 在 view 执行之前做一些操作, 可以用 middleware 来实现.
Django 默认的 Middleware:
- MIDDLEWARE = [
- 'django.middleware.security.SecurityMiddleware',
- 'django.contrib.sessions.middleware.SessionMiddleware',
- 'django.middleware.common.CommonMiddleware',
- 'django.middleware.csrf.CsrfViewMiddleware',
- 'django.contrib.auth.middleware.AuthenticationMiddleware',
- 'django.contrib.messages.middleware.MessageMiddleware',
- 'django.middleware.clickjacking.XFrameOptionsMiddleware',
- ]
中间件中的方法:
- process_request
- process_response
- process_view
- process_exception
先理解 django 项目运行流程
django 项目
1.wsgiref 模块 (socket)
报文 data--->envision--->request 对象
2. 中间键, 第一层处理业务的流程
3. 控制器 (路由 + 视图)
4.models 模型层, 模板层
5. 视图处理后把数据返回给中间件, 中间件再将数据返回给客户端
大致的流程如下图:
自定义中间件
注意 : 自定的中间件必须继承 MiddlewareMixin
导入 from
- django.utils.deprecation
- import MiddlewareMixin
1. 在 App 中创建
Mymiddlewares.py 的自定义文件
2. 在该文件中导入
- from
- django.utils.deprecation
- import
- MiddlewareMixin
3. 在 Mymiddleware.py 中创建中间件
- from django.utils.deprecation import MiddlewareMixin
- from django.shortcuts import HttpResponse
- # 中间件 1
- class M1(MiddlewareMixin):
- def process_request(self,request):
- print("M1 process_request...")
- # 返回 None 即走下一个中间件
- # return HttpResponse("禁止访问!")
- def process_response(self,request,response):
- print("M1 response....")
- return response
- def process_view(self, request, callback, callback_args, callback_kwargs):
- print("Md1 view")
- #return HttpResponse("123")
- # obj=callback(callback_args) # index(request)
- # return obj
- def process_exception(self, request, exception):
- print("md1 process_exception...")
- return HttpResponse("error")
- class M2(MiddlewareMixin):
- def process_request(self,request):
- print("M2 process_request...")
- def process_response(self, request, response):
- print("M2 response....")
- return response
- def process_view(self, request, callback, callback_args, callback_kwargs):
- print("Md2 view")
- def process_exception(self, request, exception):
- print("m2 exception",exception)
- print("md2 process_exception...")
- #return HttpResponse(exception)
4. 在 settings 中添加中间件配置 格式 :"app1.middlewares. 中间件名字 (类名)"
- MIDDLEWARE = [
- 'django.middleware.security.SecurityMiddleware',
- 'django.contrib.sessions.middleware.SessionMiddleware',
- 'django.middleware.common.CommonMiddleware',
- 'django.middleware.csrf.CsrfViewMiddleware',
- 'django.contrib.auth.middleware.AuthenticationMiddleware',
- 'django.contrib.messages.middleware.MessageMiddleware',
- 'django.middleware.clickjacking.XFrameOptionsMiddleware',
- 'app1.middlewares.M1',
- 'app1.middlewares.M2',
- ]
中间件的工作流程图:
1. 如果中间件 1 中的 process_request , 开始就 return 结果, 那么就不会走中间件 2 以及视图函数, 直接走中间件 1 的 request.response 函数, 直接返回给用户结果
来源: http://www.bubuko.com/infodetail-2915427.html