Django - 中间件

概述

  • 一个轻量级、底层的插件,可以介入 Django 的请求和响应处理过程,修改 Django 的输入或输出
  • 每个中间件组件就是一个独立的 python 类

方法

  • __init__无需任何参数,服务器响应第一个请求的时候调用一次,用于确定是否启用当前中间件
  • process_request(request)处理请求前
    • 在每个请求上执行
    • request 对象产生之后,url 匹配之前调用
    • 返回 None 或者 HTTPResponse 对象
  • process_view(request, view_func, view_args, view_kwargs)处理视图前
    • 在每个请求上执行
    • url 匹配之后,视图函数调用之前调用
    • 返回 None 或者 HTTPResponse 对象
  • process_template_response(request, response)处理模板之前 (非重点)
    • 在每个请求上执行
    • 视图函数调用之后,模板调用之前执行
    • 返回 None 或者 HTTPResponse 对象
  • process_response(request, response)处理响应后
    • 在每个请求上执行
    • 视图函数调用之后,所有响应返回浏览器之前被调用
    • 返回 HTTPResponse 对象
  • process_exception(request, exception)视图抛出异常时
    • 在每个请求上调用
    • 当视图抛出异常时调用
    • 返回一个 HTTPResponse 对象

创建中间件

  • 在应用目录下创建名为 middlewares 的包
  • 在该目录下创建中间件类文件
    1
    2
    3
    4
    5
    6
    7
    from django.utils.deprecation import MiddlewareMixin


    class MyMiddle(MiddlewareMixin):
    def process_request(self, request):
    request.description = "sunck is a good man"
    return None

    myMiddle.py

配置自定义中间件

1
2
3
4
5
6
7
8
9
10
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',
'myApp.middlewares.myMiddle.MyMiddle',
]

测试中间件

1
2
3
4
def index(request):
print('*' * 50)
print(request.description)
return render(request, 'myApp/index.html')

原理图

中间件