Django中间件

164 阅读2分钟

中间件

什么是中间件

中间件是介于request与response处理之间的一道处理过程,可以在全局上改变django的输入与输出

中间件有啥用

  • 修改HttpResquestHttpResponse

django默认的中间件执行顺序为自上而下,定义在settings.py文件中

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware', 
  	# xss脚本过滤,一些安全设置
  
    'django.contrib.sessions.middleware.SessionMiddleware',
  	# session支持中间件,在每次用户访问django项目时,添加session对每一个浏览器
  
    'django.middleware.common.CommonMiddleware', 
  	# 通用组件,比如为路由添加末尾斜杠
  
    'django.middleware.csrf.CsrfViewMiddleware',
  	# 防跨站请求伪造令牌,为客户端添加csrf_token密钥,在表单提交时需提交该值
  
    'django.contrib.auth.middleware.AuthenticationMiddleware',
  	# admin用户组件,每个request对象都会被添加admin下的user属性
  	
    'django.contrib.messages.middleware.MessageMiddleware', 
  	# 消息中间件 展示一些后台消息给前端
  	
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
  	# 防止欺骗点击攻击出现;自身页面被嵌入到他人页面中,点击欺骗 
]

中间件钩子方法

django的中间件提供了五个方法,用来处理Request到达和Response返回过程的任务

  • 在请求阶段中,调用视图之前,Django会按照MIDDLEWARE_CLASSES中定义的 顺序自顶向下应用中间件。会用到两个钩子
process_request(self,request) 

Django决定执行哪个视图之前,process_request()会被每次请求调用


process_view(self, request, callback, callback_args, callback_kwargs)
'''
view_func: Django即将使用的视图函数;是实际的函数对象,而不是函数的名称作为字符串
view_args: 将传递给视图的位置参数的列表,不包含request第一个默认参数
view_kwargs: 将传递给视图的关键字参数的字典,不包含request第一个默认参数
'''

Django调用视图之前被调用


  • 在响应阶段中,调用视图之后,中间件会按照相反的顺序应用,自底向上。会用到 三个钩子
process_template_response(self,request,response) # 仅用于模板响应
process_exception(self, request, exception) # 仅当视图抛出异常的时候
process_response(self, request, response)

process_response在所有响应返回浏览器之前被调用


注意:多个中间件中的process_response方法是按照MIDDLEWARE中的注册顺序倒序执行的,也就是说第一个中间件的process_request方法首先执行,而它的process_response方法最后执行,最后一个中间件的process_request方法最后一个执行,它的process_response方法是最先执行


自定义中间件

  • 导入所需基类
from django.utils.deprecation import MiddlewareMixin
  • 定义过程钩子方法
class Middleware(MiddlewareMixin):
    def process_request(self,request):
        print("请求")
    def process_response(self,request,response):
        print("返回")
        return response

settings支持中间件

MIDDLEWARE = [
  ...
  'Middleware',
]

中间件应用场景

  • ip筛选,高频次ip过滤
  • URL访问过滤,常结合权限判断,如rbac