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是否正确传递到了后端。
- 查看Django容器的错误日志:
内容的提问来源于stack exchange,提问作者Adam

