如何在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
相关产品推荐
相关产品推荐

