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

Django 4中如何配置CSRF_TRUSTED_ORIGINS允许任意IP访问?

解决Django 4.x中无法预设所有CSRF可信来源的问题

问题背景

将Angular/Django Web应用从Django 2.x升级到4.x后,应用需打包分发给用户部署在任意主机、域名和端口上,用户通过HTTP://whereAppIsInstalled:PORT访问。在Django 2.x中仅需以下设置即可正常运行:

ALLOWED_HOSTS = ['*',]
CORS_ORIGIN_ALLOW_ALL = True

但Django 4.x要求配置CSRF_TRUSTED_ORIGINS,而无法提前预知所有用户的主机/IP,常规添加具体地址的方案不可行,尝试添加泛域名格式也无效。

可行解决方案

方案1:使用通配符配置(Django 4.2+适用)

Django 4.2及以上版本支持在CSRF_TRUSTED_ORIGINS中使用通配符匹配所有HTTP/HTTPS来源,直接在settings.py中配置:

CSRF_TRUSTED_ORIGINS = ['http://*', 'https://*']

注意:此配置会信任所有HTTP和HTTPS来源,仅适合应用部署在可控的内部环境或信任网络中,避免暴露在公网环境下。

方案2:通过中间件动态添加可信来源

如果使用的是Django 4.0或4.1版本(不支持通配符),可以自定义中间件,在每次请求时将当前请求的Origin添加到CSRF_TRUSTED_ORIGINS中:

  1. 在项目中创建中间件文件(比如middleware.py):
from django.conf import settings

class DynamicCsrfTrustedOriginsMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        origin = request.META.get('HTTP_ORIGIN')
        if origin and origin not in settings.CSRF_TRUSTED_ORIGINS:
            settings.CSRF_TRUSTED_ORIGINS.append(origin)
        response = self.get_response(request)
        return response
  1. 在settings.py的MIDDLEWARE列表中添加这个中间件(需放在CSRF中间件之前):
MIDDLEWARE = [
    # 其他中间件...
    'your_project_name.middleware.DynamicCsrfTrustedOriginsMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    # 其他中间件...
]

注意:这种方式会动态积累所有访问过的来源,若应用长时间运行,列表会逐渐增大,可根据需求添加去重或定期清理逻辑。

方案3:自定义CSRF验证逻辑(不推荐,仅极端场景使用)

如果上述方案都不适用,可以自定义CSRF验证逻辑跳过Origin检查,但此操作会降低CSRF防护能力,仅建议在完全信任所有访问来源的场景下使用:

在settings.py中添加基础配置弱化CSRF限制:

CSRF_COOKIE_SECURE = False
CSRF_COOKIE_HTTPONLY = False

也可以针对特定视图使用@csrf_exempt装饰器跳过验证,但需逐个视图添加。

补充说明

  • 保留ALLOWED_HOSTS = ['*']和CORS_ORIGIN_ALLOW_ALL = True的配置,这是允许任意主机访问的基础。
  • 如果用户使用HTTPS访问,需确保CSRF_TRUSTED_ORIGINS中包含https://*。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 05:47:21