中间件-Django(个人记录)

中间件-Django

在这里插入图片描述
在这里插入图片描述

创建自定义中间件文件

  • 创建middlewares文件夹
  • 新建一个py文件在里面编写类

编写类

原始方式(MiddlewareMixin源码实现流程)

记得注册中间件

class MyMd(object):
    def __init__(self, get_response=None):
        self.get_response = get_response

    def __call__(self, request):
        # 进来
        print("来了")
        response = self.get_response(request)
        # 出去
        print("走了")
        return response

继承MiddlewareMixin(建议)

from django.utils.deprecation import MiddlewareMixin

class AuthMiddleware(MiddlewareMixin):
	def process_request(request):
        pass
    
    def process_view(self, request, view_func, view_args, view_kwargs):
        pass  # view_func匹配成功的视图函数,view_args, view_kwargs路由里的参数,像正则
    
    def process_response(request, response):
        pass
    
    def process_exception(self, request, exception):
        pass  # exception是报错的信息,可以写进日志并return指定的页面给用户而不是报错信息
    
    def process_template_response(self, request, response):
        pass

定义类方法

路由匹配:根据用户访问的url找到对应的视图函数

中间件5个类方法

- process_request   # 执行完所有中间件的这个方法才执行路由匹配
- process_view  	# 如果有return值不会立即返回
- process_response  # 视图函数执行完后立即执行的
- process_exception  # 异常之后执行
- process_template_response  # 视图函数返回TemplateResponse对象 or 对象中含有render方法才执行
# 视图函数执行完后立即执行的,相当于拆分了rander方法,返回HttpResponse时永远不执行

流程

  • 从用户出发
  • 先执行所有中间件的process_request,然后进行路由匹配
  • 再回去执行所有中间件的process_view,再进到视图函数
  • 再从后到前执行所有中间件的process_response,将视图函数返回的数据返回到用户
  • 若报错,则执行process_exception
  • 若视图函数返回TemplateResponse对象或对象中有render() 方法,则执行process_template_response

注册中间件

MIDDLEWARE = [
	…………
    
    'middlewares.md.MyMd1',
    'middlewares.md.MyMd2',
    'middlewares.md.MyMd3',
]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值