Django 中间件

一、什么是中间件

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

但是由于其影响的是全局,所以需要谨慎使用,使用不当会影响性能。

说的直白一点中间件是帮助我们在视图函数执行之前和执行之后都可以做一些额外的操作,它本质上就是一个自定义类,类中定义了几个方法,Django框架会在处理请求的特定的时间去执行这些方法。

我们一直都在使用中间件,只是没有注意到而已,打开Django项目的Settings.py文件,看到下图的MIDDLEWARE配置项。

=`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',
]`

MIDDLEWARE配置项是一个列表,列表中是一个个字符串,这些字符串其实是一个个类,也就是一个个中间件。

二、自定义中间件

中间件可以定义五个方法,分别是:(主要的是process_request和process_response)

  • process_request(self,request)
  • process_view(self, request, view_func, view_args, view_kwargs)
  • process_template_response(self,request,response)
  • process_exception(self, request, exception)
  • process_response(self, request, response)
    以上方法的返回值可以是None或一个HttpResponse对象,如果是None,则继续按照django定义的规则向后继续执行,如果是HttpResponse对象,则直接将该对象返回给用户。

1、 process_request
(1)执行时间:在视图函数执行之前
(2)参数:request ——》 视图函数中用到的request
(3)执行顺序:按照注册顺序顺序执行
(4)返回值:
None 正常流程走
HttpResponse对象
当前中间件后面的中间件的process_request和process_response方法、视图函数都不执行
执行当前中间的process_response方法以及之前的中间的process_response方法

2、process_response
(1)执行时间:在视图函数执行之后
(2)参数:request ——》 视图函数中用到的request
response —— 》视图函数中返回的response
(3)返回值:必须是response对象
(4)执行顺序:按照注册顺序倒叙执行
在这里插入图片描述
在这里插入图片描述
3、process_view
process_view(self, request, view_func, view_args, view_kwargs)
(1)执行时间:在process_request之后,以及路由匹配之后,在视图函数执行之前
(2)参数:
view_func ——》 要执行的视图函数
view_args ——》 视图函数的位置参数
view_kwargs ——》 视图函数的关键字参数
(3)返回值:None 正常走
(4)执行顺序:按照注册顺序顺序执行

该方法有四个参数

request是HttpRequest对象。

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

view_args是将传递给视图的位置参数的列表(无名分组分过来的值).

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

Django会在调用视图函数之前调用process_view方法。

它应该返回None或一个HttpResponse对象。 如果返回None,Django将继续处理这个请求,执行任何其他中间件的process_view方法,然后在执行相应的视图。 如果它返回一个HttpResponse对象,Django不会调用适当的视图函数。 它将执行中间件的process_response方法并将应用到该HttpResponse并返回结果。

在这里插入图片描述

4、process_exception(self, request, exception)
(1)执行时间(触发条件:有异常才执行):在视图函数之后,在process_response之前
(2)参数:exception ——》 错误信息对象
(3)返回值:
None 正常走
HttpResponse对象
注册顺序之前的中间件的process_exception方法不走了。
执行所有中间件的process_response方法

(4)执行顺序:按照注册顺序倒叙执行

在这里插入图片描述

5、process_template_response
(1)执行时间:(触发条件:response对象要求有一个render方法)在视图函数之后,在process_response之前
(2)参数
(3)返回值:返回response
(4)执行顺序:按照注册顺序倒叙执行

三、示例

class MD1(MiddlewareMixin):

    def process_request(self, request):
        print('这是MD1中的process_request方法')

    def process_response(self, request, response):
        print('这是MD1中的process_response方法')
        return response

    def process_view(self, request, view_func, view_args, view_kwargs):

        print('这是MD1中的process_view方法')

    def process_exception(self, request, exception):
        # print(exception,type(exception))
        print('这是MD1中的process_exception方法')
        return HttpResponse(str(exception))


    def process_template_response(self,request,response):
        print('这是MD1中的process_template_response方法')

        return HttpResponse('okkkk')

在setting配置文件里注册
在这里插入图片描述

参考:https://www.cnblogs.com/maple-shaw/articles/9333824.html
https://www.cnblogs.com/sui776265233/p/9664642.html#_label3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值