Django中Middleware中的函数详解
一个middleware的例子
importtime fromdjango.urlsimportreverse fromdjango.utils.deprecationimportMiddlewareMixin classTimeItMiddleware(MiddlewareMixin): defprocess_request(self,request): return defprocess_view(self,request,func,*args,**kwargs): ifrequest.path!=reverse('index'): returnNone start=time.time() response=func(request) costed=time.time()-start print('processview:{:.2f}s'.format(costed)) returnresponse defprocess_excepttion(self,request,exception): pass defprocess_template_response(self,request,response): returnresponse defprocess_response(self,request,response): returnresponse
middleware中的函数有:
- process_request
- process_view
- process_tmplate_response
- process_response
- process_exception
下面分别进行介绍:
process_request:
这是请求来到middleware中时讲入的第一个方法。一般情优下,我们以在这里做一些校验,比如用户登录或者HTTP中是否有认证头之类的验证.这个方法可以有两种返回值HttpResnonse或者None,如果返回HttpResponse,那么接下米的处理方法只会执行process_response,其他方法将不会被执行。这里需要注意的是,如果你的middleware是settings配置的MIDDLEWARE的第一个,那么剩下的middleware也不会被执行;如果返回None,那么Diango会继续执行其他方法。
process_view:
这个方法是在process_request方法之后执行的,参数如上面代码所示,其中func就是我们将要执行的view方法。因此,如果要统计一个view的执行时间,可以在这里做。它的返回值跟process_request一样,是HttpResponse或者None,其逻辑也一样。如果返回None,那么Django会帮你执行view函数,从而得到最终的response。
Process_template_response:
执行完上面的方法,并且Django帮我们执行完view,拿到最终的response后,如果使用了模板的response(这是指通过returnrender(request,'index.html',context={})方式返回的response),就会来到这个方法中。在这个方法中,我们可以对response做一下操作,比如Content-Type设置,或者其他header的修改/增加。
process_response:
当所有流程都处理完毕后,就来到了这个方法。这个方法的逻辑跟process_template_response是完全一样的,只是后者是针对带有模板的response的处理。
process_exception:
上面的处理方法是按顺序介绍的,而这个方法不太一样。只有在发生异常时,才会进入这个方法。哪个阶段发生的异常呢?
可以简单理解为在将要调用的View中出现异常(就是在process_view的func函数中)或者返回的模板response在渲染时发生的异常。但是需要注意的是,如果你在process_view中手动调用了func,就像我们上面做的那样,就不会触发process_exception了。这个方法接收到异常之后,可以选择处理异常,然后返回一个含有异常信息的HttpResponse,或者直接返回None不处理,这种情况下Django会使用自己的异常模板。
以上节选自《Django企业开发实战》胡阳著。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。