Django之中间件


前言

中间件源码分析


1、中间件总体流程图

在这里插入图片描述

中间件流程:定义类 ==> 定义类中的方法 ==> settings.py文件中对中间件进行注册

2、原始方式

2.1 新建middleware文件

定义类:MyMd()及方法
在这里插入图片描述

2.2 注册

在这里插入图片描述

3、开发使用时建议继承MiddlewareMixin

在这里插入图片描述
源码:

  • 面向对象

    class MyMd(object):
        def __init__(self....):
            pass
            
        # django内部默认执行call方法,传入参数。
        def __call__(self,....):
            pass
    
  • 反射

    class MiddlewareMixin:
        def __init__(self, get_response=None):
            self.get_response = get_response	
    
        # django内部默认执行call方法,传入参数。    
        def __call__(self, request):
            response = None
            if hasattr(self, 'process_request'):
                response = self.process_request(request)
            response = response or self.get_response(request)
            if hasattr(self, 'process_response'):
                response = self.process_response(request, response)
            return response
        
    # 项目开发时进行配置的部分process_request、process_response
    class MyMd(MiddlewareMixin):
        
        def process_request(self,request):
            ...
        
        def process_response(self,request, response):
            ...
    
  • 流程图
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

要点:

  • process_request:方法如果有返回值,则流程终止于当前,后续中间件不会再走,不会进入到视图函数;返回流程详见蓝色箭头线;
  • process_reponse:方法必定有返回值;

4、process_view相关

  • process_view是在django中源码中写死了;
  • prcess_request执行时,进行了路由匹配,中间件方法执行request.resolver_match时,返回True;但是代码流程还未进入到视图函数阶段,视图函数中执行request.resolver_match获取不到值;
    在这里插入图片描述

5、总结

  • process_request,进入视图函数前执行一些操作,如设置访问黑白名单等;
  • process_view,进入视图函数中执行一些操作,如用户登录后,保存用户信息等;
  • process_reponse,返回数据到浏览器前执行一些操作,如果进行跨域配置添加响应头信息等;
  • process_exception,视图函数出现异常,自定义异常页面;
  • process_template_response,视图函数返回TemplateResponse对象 or 对象中含有.render方法。
  • 23
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值