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

Docker部署Django 1.11时AJAX POST请求CSRF验证失败求助

我来帮你捋捋这个Docker部署Django 1.11后AJAX POST请求CSRF验证失败的问题——毕竟本地runserver正常,大概率是容器环境下的配置细节没跟上,试试下面这些排查和解决步骤:

  • 检查Nginx代理的请求头与Cookie传递配置
    用jwilder/nginx-proxy的时候,很容易因为请求头传递不全导致Django无法正确识别请求来源。你需要确保虚拟主机配置里包含这两个关键指令:

    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    

    另外,Django的settings.py里要把CSRF_COOKIE_DOMAIN和SESSION_COOKIE_DOMAIN设置为你的虚拟主机域名(比如example.com),不要留空——本地runserver默认会自动适配,但容器环境下必须明确指定,不然Cookie会和请求域名不匹配。

  • 确认AJAX请求的CSRF Token获取逻辑
    虽然本地生效,但容器环境下Cookie的路径或属性可能有变化,重新检查前端的Token获取代码是否正确从Cookie中读取csrftoken:

    function getCookie(name) {
        let cookieValue = null;
        if (document.cookie && document.cookie !== '') {
            const cookies = document.cookie.split(';');
            for (let i = 0; i < cookies.length; i++) {
                const cookie = cookies[i].trim();
                if (cookie.substring(0, name.length + 1) === (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
    const csrftoken = getCookie('csrftoken');
    

    并且要确保AJAX请求里确实把这个Token放到了X-CSRFToken请求头里,比如jQuery的写法:

    $.ajax({
        type: 'POST',
        url: '/your-api-endpoint/',
        headers: {'X-CSRFToken': csrftoken},
        data: {/* 请求数据 */},
        success: function(res) {/* 处理逻辑 */}
    });
    
  • 验证Redis会话缓存的配置与连通性
    既然用了Redis做会话缓存,先确认Django的配置是否正确指向Redis容器:

    # settings.py
    CACHES = {
        'default': {
            'BACKEND': 'django_redis.cache.RedisCache',
            'LOCATION': 'redis://redis:6379/1',  # 这里的redis是docker-compose里的服务名
            'OPTIONS': {
                'CLIENT_CLASS': 'django_redis.client.DefaultClient',
            }
        }
    }
    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
    SESSION_CACHE_ALIAS = 'default'
    

    然后进入Django容器测试Redis连通性:

    docker-compose exec django python manage.py shell
    

    在shell里执行:

    import redis
    r = redis.Redis(host='redis', port=6379, db=1)
    print(r.ping())  # 返回True说明连通正常
    

    如果连通失败,检查docker-compose里的Redis服务是否正常启动,网络配置是否正确。

  • 设置CSRF信任来源
    Django 1.11的CSRF_TRUSTED_ORIGINS配置用来指定允许的请求来源,把你的虚拟主机域名加进去:

    # settings.py
    CSRF_TRUSTED_ORIGINS = ['example.com']  # 替换成你的实际域名
    

    注意这个参数在Django 1.11里是列表格式,不要和新版本的配置混淆。

  • 查看日志定位具体错误
    最后,一定要看日志找细节:

    • 查看Django容器的错误日志:docker-compose logs django,看看CSRF失败的具体提示(比如是"CSRF cookie not set"还是"CSRF token missing or incorrect"),不同的提示对应不同的问题。
    • 查看Nginx容器的访问日志:docker-compose logs nginx,确认X-CSRFToken头和Cookie是否正确传递到了后端。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:07:21