Django中间件学习

1. 什么是中间件

中间件‌是一个轻量级、底层的“插件”系统,用于全局地修改 Django 的输入或输出。中间件可以在请求到达视图函数处理之前和响应返回客户端之前执行特定的操作,从而实现各种功能,如身份验证、日志记录、压缩、内容过滤等‌

中间件的功能

‌请求预处理‌:在视图函数处理请求之前,执行一些前置操作,如请求验证、设置请求参数等。
‌响应后处理‌:在视图函数处理完请求后,对生成的响应进行处理,如设置 HTTP 头、压缩响应内容等。
‌异常处理‌:捕捉处理请求或响应过程中的异常。

2. 中间件定义

  1. 工厂函数定义中间件
def my_middleware(get_response):
    def middleware(request):
        print('视图函数执行之前')
        response = get_response(request)
        print('视图函数执行之后')
        return response
    return middleware

  1. 使用类定义中间件
class MW1(MiddlewareMixin):
    def process_request(self, request):
        print("MW1 process_request")
        return None

    def process_view(self, request, view_func, view_args, view_kwargs):
        print("MW1 process_view")
        return None

    def process_response(self, request, response):
        print("MW1 process_response")
        return response

3. 中间件属性与方法介绍

  1. process_request(self, request):处理请求之前调用。如果返回None,继续处理其他中间件的同一方法,如果返回HttpResponse对象,则中止处理,将响应返回给浏览器。

  2. process_view(self, request, view_func, view_args, view_kwargs):调用视图函数之前调用。如果返回None,继续处理,否则返回的HttpResponse对象将直接作为响应返回给浏览器。

  3. process_template_response(self, request, response):在视图函数处理完后,返回的响应对象具有render()方法时调用。如果返回None,继续处理,否则返回的HttpResponse对象将直接作为响应返回给浏览器。

  4. process_response(self, request, response):所有响应返回之前调用。如果返回None,继续处理,否则返回的HttpResponse对象将直接作为响应返回给浏览器。

  5. process_exception(self, request, exception):如果视图函数抛出异常,这个方法将被调用。如果返回None,异常将被重新抛出。如果返回HttpResponse对象,则中止处理,将响应返回给浏览器。

4. 中间件执行顺序

首先执行 process_request 函数,然后在执行视图函数之前执行 process_view 函数,然后执行视图函数,最后执行 process_response 函数
请添加图片描述

process_request 只返回 None,都执行完之后,就匹配路由,找到要执行的视图函数,在执行视图函数之前先执行中间件的 process_view 函数

如果 process_view 返回 None,就继续执行后续的中间件的 process_view 方法,执行完所有的 process_view 函数之后就执行视图函数

如果其中有个 process_view 返回了 HttpResponse,就不执行后续的 process_view 函数,会跳到第一个 process_response 函数,并继续往下执行!

请添加图片描述

如果有 process_request 函数返回了 HttpResponse 对象,就不执行后续的 process_request 函数,也不执行 process_view 函数,直接跳转到相应的 process_response 函数执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值