前言
这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题
于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。
微信小程序搜索:Python面试宝典
或可关注原创个人博客:https://lienze.tech
也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习
中间件
什么是中间件
中间件是介于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