码迷,mamicode.com
首页 > 其他好文 > 详细

django中间件

时间:2019-12-04 22:02:53      阅读:94      评论:0      收藏:0      [点我收藏+]

标签:自带   钩子   默认   mixin   except   learn   名称   框架   包含   

中间件

官方的说法:中间件是一个用来处理Django的请求和响应的框架级别的钩子。它是一个轻量、低级别的插件系统,用于在全局范围内改变Django的输入和输出。每个中间件组件都负责做一些特定的功能。

django中自带7个中间件,每个中间件发挥自己的一些作用,中间件的执行顺序是按照settings中由上到下,每一层都相当于是一个过滤器.

自定义中间件

前提:使用自定义中间件要在settings中注册

from django.utils.deprecation import MiddlewareMixin
class MyMiddleWare(MiddlewareMixin):
    def process_request(self,request):
        pass

自定义的中间键支持5个自定义方法

  • process_request(self,request)
  • process_response(self, request, response)
  • process_view(self, request, view_func, view_args, view_kwargs)
  • process_template_response(self,request,response)
  • process_exception(self, request, exception)
process_request
  • 该方法会在视图函数执行之前执行.
  • 当由多个中间件的时候,按照MIDDLEWARE中的注册顺序,从上到下的执行.
  • 不同的中间件中传递的request都是同一个对象
  • 在该方法中,一旦返回了HttpResponse对象,就会立即停止后面的中间件的执行,给前端返回值.
process_response
  • 该方法在视图函数执行之后执行.
  • 执行顺序可以理解为压栈,与process_request互为一对.先执行的process_request,其process_response就后执行.
  • 该方法返回的对象就是前端直接获取的数据.
  • 该方法的返回值必须是HttpResponse对象
process_view
  • 该方法会在视图函数调用之前执行.

  • request是HttpRequest对象。

    view_func是Django即将使用的视图函数。 (它是实际的函数对象,而不是函数的名称作为字符串。)

    view_args是将传递给视图的位置参数的列表.

    view_kwargs是将传递给视图的关键字参数的字典。 view_args和view_kwargs都不包含第一个视图参数(request)。

  • 它应该返回None或一个HttpResponse对象。 如果返回None,Django将继续处理这个请求,执行任何其他中间件的process_view方法,然后在执行相应的视图。 如果它返回一个HttpResponse对象,那么将不会执行Django的视图函数,而是直接在中间件中掉头,倒叙执行一个个process_response方法,最后返回给浏览器

process_exception
  • 这个方法只有在视图函数中出现异常了才执行,如果视图函数中无异常,process_exception方法不执行。
  • exception是视图函数异常产生的Exception对象。
  • 它返回的值可以是一个None也可以是一个HttpResponse对象。如果是HttpResponse对象,Django将调用模板和中间件中的process_response方法,并返回给浏览器,否则将默认处理异常。如果返回一个None,则交给下一个中间件的process_exception方法来处理异常。它的执行顺序也是按照中间件注册顺序的倒序执行。
process_template_response(用的比较少)
  • process_template_response是在视图函数执行完成后立即执行,但是它有一个前提条件,那就是视图函数返回的对象有一个render()方法(或者表明该对象是一个TemplateResponse对象或等价方法)。

中间件的执行流程

按照MIDDLEWARE中顺序自上而下执行

一旦process_request中返回了HttpResponse对象,就将前面的process_request所对应的process_response出栈返回.这时,还没有一个视图函数被执行,直接在中间件层就完成了返回.

技术图片

橙色为主要执行流程

绿色为同步执行,中间件返回数据会同步发送给缓存

蓝色为当中间件中process_request返回Httpresponse时执行

蓝色:请求发到服务端,会去缓存中查找数据,查到直接返回,没查到继续向下走

django中间件

标签:自带   钩子   默认   mixin   except   learn   名称   框架   包含   

原文地址:https://www.cnblogs.com/agsol/p/11985744.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!