欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Django中间件的使用

程序员文章站 2023-09-07 18:44:10
Django中间件的使用 中间件(middleware) 中间件应用于request与服务端之间和服务端与response之间,客户端发起请求到服务端接收可以通过中间件,服务端返回响应与客户端接收响应可以通过中间件,也就是说中间件可以处理request和response。 Django默认的中间件 ......

django中间件的使用

中间件(middleware)

中间件应用于request与服务端之间和服务端与response之间,客户端发起请求到服务端接收可以通过中间件,服务端返回响应与客户端接收响应可以通过中间件,也就是说中间件可以处理request和response。

django默认的中间件

在settings中django以及默认添加了许多有用的中间件

middleware = [
    'django.middleware.security.securitymiddleware',
    'django.contrib.sessions.middleware.sessionmiddleware',
    'django.middleware.common.commonmiddleware',
    'django.middleware.csrf.csrfviewmiddleware',
    'django.contrib.auth.middleware.authenticationmiddleware',
    'django.contrib.messages.middleware.messagemiddleware',
    'django.middleware.clickjacking.xframeoptionsmiddleware',
]

上面的配置中的中间件是有顺序的,从上到下依次通过,我们自定义的中间件如果使用的话也要按照正确的顺序添加到这里

中间件中的方法

中间件中有5个方法可以定义:

  • process_request(self,request)
  • process_view(self, request, callback, callback_args, callback_kwargs)
  • process_template_response(self,request,response)
  • process_exception(self, request, exception)
  • process_response(self, request, response)

process_request

  • 客户端发来请求与路由匹配执行之前执行
  • 返回值是none时,继续向后执行下一个中间件的process_request或路由映射
  • 返回值是httpresponse对象时,不执行路由与views函数,直接执行该中间件与其之前的process_response,倒序执行

process_view

  • 在执行完所有中间件的process_request与路由映射之后,views函数执行之前执行
  • 执行顺序依然从第一个中间件到最后一个中间件
  • callback参数为执行的views函数
  • callback_args, callback_kwargs为views函数的参数
  • 返回值是none时,继续向后执行下一个中间件的process_view或views函数
  • 返回值是httpresponse对象时,不执行views函数,直接执行所有中间件的process_response,倒序执行

process_template_response

  • 视图函数返回的对象有一个render()方法(或者表明该对象是一个templateresponse对象或等价方法)时,才被执行(并不是views函数最后返回render对象)
  • 在views执行之后,process_exception执行之前执行
  • 返回值必须是response
  • 倒序执行

process_exception

  • process_exception用于捕捉views函数中的异常
  • 在process_response之前执行
  • exception是views函数中产生的异常对象
  • 返回值是none时继续正常执行
  • 返回值是httpresponse对象:不再执行后面的process_exception方法,直接执行process_response
  • 倒序执行

process_response

  • 在response返回给客户端之前执行,也就值最后经过
  • 必须返回httpresponse对象

这里要注意,在执行views函数之前的中间件的方法都是正常顺序执行,views执行之后的中间件的方法是倒序执行
这里借用 里的图片
Django中间件的使用

定义自己的中间件

from django.utils.deprecation import middlewaremixin

class mymiddleware(middlewaremixin):
    def process_request(self, request):
           print('->process_request')
    def process_view(self, request, view_func, view_args, view_kwargs):
        print('->view')
        pass

    def process_exception(self, request, exception):
        pass
    def process_response(self, request, response):
        print('->process_response')
        return response
    def process_template_response(self,request,response):
        print('->process_template_response')
        return response

其中的方法可以不完全实现,只需要实现自己需求的方法即可
定义后别忘了在settings中完成激活