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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:15:36