django中间件小知识

浅谈django中间件小知识

下面这幅图是我从网上随便扒了一幅图,主要让读者能够大致知道django请求的生命周期。

2608805-20220225142403768-357680105

下面这幅图主要用来说明从客户端请求进来到中间件之后的一个先后顺序以及一些原理性的东西,这里不做django基础知识点的说明,可能会涉及到源码。

image-20221108175940938

下面直接动手来回答这些问题

问题1:关于process_request和process_response处理请求的先后顺序(process_request可以理解为是用户请求进来的时候中间件会做些什么。而process_response的作用主要是给用户最终将处理好的数据经过中间件返回给用户)

话不多少直接准备一个例子做下测试,我这里写了三个中间件,并且都已经注册过了,下面是测试准备的代码。

from django.utils.deprecation import MiddlewareMixin

class Md1(MiddlewareMixin):
    def process_request(self,request):
        print("md1来了")
    def process_response(self,request,response):
        print("md1走了")
        return response

class Md2(MiddlewareMixin):
    def process_request(self,request):
        print("md2来了")
    def process_response(self,request,response):
        print("md2走了")
        return response

class Md3(MiddlewareMixin):
    def process_request(self,request):
        print("md3来了")
    def process_response(self,request,response):
        print("md3走了")
        return response

我们看一下返回结果

image-20221108183706768

从上面看我们知道执行的结果是 请求进来的时候是正序,请求出去的时候则会是倒序。

image-20221109100234766

问题2:如果我在其中一个中间件请求的时候返回了response,那会如何呢?请求流程还会走完吗?

image-20221109093436226

从上面的图中我们可以看到我们在md2中的process_request直接return了HttpResponse,结果路由没经过md3就直接给返回出去了。

image-20221109102457015

问题3:借着问题2我们再来想一个问题?看上图,我的url不是指向了home/吗?为啥HttpreSponse直接给返回到这里了?难道他中间件的执行在路由之前?

好说分别在中间件process_request打印一下request.resolver_match看一下返回信息不就行了吗?

image-20221109110517506

image-20221109110532741

ok,添加完成之后我们来测试一下,看一下返回值。

image-20221109110738774

那也就证实了问题2上的问题,在middleware之前是没有路由匹配的。

image-20221109114807165

三者的区别和作用也就如上图一样,一目了然,例如如果给用户权限做些判断,那么就可以在process_request的时候做,路由分发之后需要对视图做处理,那就用process_view,如果需要给用户的返回信息做处理,那就用process_response.

问题4 如果process_view做了return那会如何?和问题2的结果会一样吗?

为了方便大家测试和理解,我把中间件这部分的代码贴到下面

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import render,HttpResponse

class Md1(MiddlewareMixin):
    def process_request(self,request):
        print("md1来了")
        #print(request.resolver_match)
    def process_view(self,request,view_func,view_agrs,view_kwargs):
        print("view1来了")
        return HttpResponse("我被view1给return了")
    def process_response(self,request,response):
        print("md1走了")
        return response

class Md2(MiddlewareMixin):
    def process_request(self,request):
        print("md2来了")
        #return HttpResponse("因为权限不够啦,所以我得走了")
    def process_view(self,request,view_func,view_agrs,view_kwargs):
        print("view2来了")
    def process_response(self,request,response):
        print("md2走了")
        return response

class Md3(MiddlewareMixin):
    def process_request(self,request):
        print("md3来了")
    def process_view(self,request,view_func,view_agrs,view_kwargs):
        print("view3来了")
    def process_response(self,request,response):
        print("md3走了")
        return response

我们可以看到当process_view被return的时候,那就会递给process_response,当然,这里不是给md1的process_response,而是给了md3.

image-20221109115746481

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值