Django框架之中间件详解

前言

这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题

于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。

微信小程序搜索:Python面试宝典

或可关注原创个人博客:https://lienze.tech

也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习

中间件

什么是中间件

中间件是介于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在所有响应返回浏览器之前被调用

扫描二维码关注公众号,回复: 13310316 查看本文章

注意:多个中间件中的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

猜你喜欢

转载自blog.csdn.net/HeroicLee/article/details/121508145