Django Session本地正常 部署DigitalOcean服务器失效如何解决
核心排查步骤(按问题出现概率从高到低排序)
1. 优先核对Session Cookie的安全相关配置
本地localhost属于浏览器可信源,会豁免大量Cookie安全限制,线上环境这些配置错了会直接被浏览器拦截Cookie:
- 检查
SESSION_COOKIE_SECURE配置:如果站点还没配置HTTPS,这个值必须设为False。该值为True时浏览器只会在HTTPS连接下接收Session Cookie,本地HTTP访问localhost不受这个规则限制,但线上HTTP访问会直接被拦截。 - 检查
SESSION_COOKIE_DOMAIN配置:这个值不要带协议头(比如不要写成https://yourdomain.com)、不要带端口号;如果是直接用DigitalOcean的公网IP访问服务,这个值留空即可,Django会自动适配请求的域名,手动填错格式会直接导致Cookie下发失败。 - 检查
SESSION_COOKIE_SAMESITE配置:如果设置为None,必须同时开启SESSION_COOKIE_SECURE=True且站点为HTTPS,否则浏览器直接拦截;部署初期可以先设为Lax适配绝大多数场景,不要一开始就开Strict导致跨跳转场景Cookie丢失。
2. 核对Session存储的权限与初始化状态
三种Session存储模式都可能因为服务端写入失败,导致根本不生成Set-Cookie响应头:
- 用文件存储时:你配置的
SESSION_FILE_PATH目录,必须给Django运行进程的所属用户(通常是部署用户或者www-data)开放读写权限,权限不足时Django无法写入Session文件,自然不会返回Cookie。权限修正参考命令:
# 替换为实际项目路径和运行用户 chown -R deploy_user:www-data /path/to/your/project/session chmod -R 755 /path/to/your/project/session
- 用数据库存储时:登录服务器进入项目目录,执行
python manage.py migrate,确保django_session表已经正常创建,缺失表结构会导致Session写入直接报错。 - 用签名Cookie存储时:检查
SECRET_KEY配置,服务器上的SECRET_KEY不能为空、不能包含非法字符,否则签名生成失败。
3. 检查视图逻辑与中间件配置
- 确认
pre_login视图中给request.session['pre_login']赋值后,代码没有抛出未捕获的异常——异常中断响应流程的话,Session保存逻辑根本不会执行。可以临时开启DEBUG模式(排查完成后务必关闭)或者查看Django运行日志,确认视图执行没有报错。 - 如果
pre_login视图返回的是流式响应、文件下载响应这类特殊响应,Django不会自动触发Session保存,需要在返回响应前手动调用request.session.save()强制写入。 - 确认
django.contrib.sessions.middleware.SessionMiddleware没有被注释、顺序正确,必须放在CommonMiddleware之前、AuthenticationMiddleware之后。
4. 检查反向代理配置(Nginx/Caddy等)
如果用了反向代理转发请求到Gunicorn/uWSGI运行的Django服务,很容易出现代理层拦截Cookie头的问题:
- 检查代理配置有没有写规则过滤
Set-Cookie响应头,很多默认的安全加固规则会误删自定义Cookie。 - 如果代理层做了HTTPS卸载,必须在Nginx配置中添加协议转发头:
location / { proxy_pass http://127.0.0.1:8000; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $host; }
同时在Django的settings.py中添加对应配置,避免Django误判请求协议:
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') USE_X_FORWARDED_HOST = True ALLOWED_HOSTS = ["你的服务器公网IP", "你的站点域名"]
5. 浏览器端定位问题边界
打开浏览器开发者工具的「网络」面板,找到pre_login接口的响应内容:
- 如果响应头里根本没有
Set-Cookie字段,问题出在Django服务端,按前面1-4步逐一排查 - 如果响应头里有
Set-Cookie但浏览器没有存储,看Cookie的Domain、Secure、SameSite属性和当前访问地址不匹配,调整对应Cookie配置即可
内容的提问来源于stack exchange,提问作者Ankzious
相关产品推荐
相关产品推荐

