You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中仅调用一次中间件,跳过响应阶段执行

Django中间件仅在请求阶段执行的实现方法

Django中间件默认会在请求进入和响应返回两个阶段被调用,但你可以通过调整中间件的实现逻辑,让它只在请求阶段执行检查,响应阶段直接跳过自定义处理。以下是两种常见实现方式:

类式中间件实现

类式中间件通过__call__方法处理请求和响应流程,我们只在调用get_response(传递请求到后续环节)之前执行IP检查逻辑,响应阶段直接返回结果即可:

from django.http import HttpResponseForbidden

class IPAllowListMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        # 定义允许访问的IP列表
        self.allowed_ips = {'127.0.0.1', '192.168.1.100'}

    def __call__(self, request):
        # 仅在请求进入时执行IP校验
        client_ip = request.META.get('REMOTE_ADDR')
        if client_ip not in self.allowed_ips:
            return HttpResponseForbidden("IP地址不在允许列表中")
        
        # 直接获取响应并返回,不添加响应阶段的自定义逻辑
        response = self.get_response(request)
        return response

函数式中间件实现

函数式中间件的逻辑类似,内层函数先处理请求检查,再直接传递请求并返回响应:

from django.http import HttpResponseForbidden

def ip_allow_list_middleware(get_response):
    allowed_ips = {'127.0.0.1', '192.168.1.100'}
    def middleware(request):
        # 请求阶段执行IP校验
        client_ip = request.META.get('REMOTE_ADDR')
        if client_ip not in allowed_ips:
            return HttpResponseForbidden("IP地址不在允许列表中")
        
        # 响应阶段直接返回结果,无额外处理
        response = get_response(request)
        return response
    return middleware

配置注意事项

将上述中间件添加到settings.py的MIDDLEWARE列表中,建议将IP检查类中间件放在靠前位置,确保请求在进入其他业务逻辑前完成校验。

内容的提问来源于stack exchange,提问作者thuc ta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 05:47:09