Django Cors Handler校验返回false未拦截不合规API请求问题
问题描述
我配置的Django Cors框架处理器已正常加载运行,但未实现跨域请求过滤效果。我在处理器中添加打印语句调试后发现,校验逻辑返回值为false(按设计逻辑应当触发请求拒绝),但实际并未拦截发往视图端点的请求。我未对视图代码做任何修改(此前认为不需要修改视图层),请问是否遗漏了相关配置,导致系统无法拒绝不符合cors_allow_mysites校验规则的请求?
相关代码如下:
handlers.py
from corsheaders.signals import check_request_enabled def cors_allow_mysites(sender, request, **kwargs): return ("Origin" in request.headers) and (request.headers["Origin"] == 'url.com') check_request_enabled.connect(cors_allow_mysites)
apps.py
from django.apps import AppConfig class ApiEndpointConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'api_endpoint' def ready(self): # 确保所有信号处理器完成注册 from . import handlers # noqa
__init__.py
default_app_config = "api_endpoint.apps.ApiEndpointConfig"
问题原因
你误解了check_request_enabled信号的设计作用:
- 这个信号仅用于标记哪些请求需要进入CORS校验流程,本身不承担请求拦截的功能。只要有任意一个信号接收器返回
True,django-cors-headers才会对该请求执行跨域头检查、非法来源拦截;如果所有接收器都返回False,框架会直接跳过整个CORS处理环节,根本不会触发拦截逻辑。 - 你当前的写法是仅当请求Origin为
url.com时返回True,其余情况返回False,直接导致非允许来源的请求绕过了CORS中间件,自然不会被拦截。 - 额外排查项:确认
corsheaders.middleware.CorsMiddleware在settings.py的MIDDLEWARE列表中排在django.middleware.common.CommonMiddleware之前,位置错误会导致中间件本身不生效。
修复方法
直接使用框架原生的白名单配置做来源拦截即可,不需要自定义信号处理器,在settings.py中添加如下配置:
CORS_ALLOW_ALL_ORIGINS = False CORS_ALLOWED_ORIGINS = [ "https://url.com", ]
如果有复杂的自定义校验需求必须用信号实现,注意信号逻辑只用来标记需要校验的请求范围,拦截逻辑交给框架本身处理,不要靠返回False来尝试拦截请求,这种写法本身不会生效。
内容的提问来源于stack exchange,提问作者bernardo
相关产品推荐
相关产品推荐

