中间件
什么是中间件
中间件是介于request与response处理之间的一道处理过程,可以在全局上改变django的输入与输出
中间件有啥用
- 修改
HttpResquest、HttpResponse
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