如何实现Django两个应用登录状态自动同步?
Django多应用会话共享实现方案(跨端口自动同步登录)
针对你有两个共享同一数据库的Django应用(app1运行在localhost:8000,app2运行在localhost:8010),要实现登录其中一个应用后自动同步登录另一个的需求,用Redis做会话存储是最优方案,具体步骤如下:
一、部署Redis服务
- 安装Redis:根据操作系统选择对应方式(Ubuntu用
sudo apt install redis-server,CentOS用sudo yum install redis,Windows可下载官方安装包)。 - 启动Redis服务并验证:运行
redis-cli ping,返回PONG则服务正常可用。
二、配置两个Django应用
两个应用的配置必须完全一致,否则会话无法互通。
1. 安装依赖
在两个应用的虚拟环境中执行:
pip install redis django-redis
2. 修改settings.py核心配置
(1)统一SECRET_KEY
Django的会话签名依赖此密钥,两个应用的SECRET_KEY必须完全相同,否则跨应用的会话会被判定为无效。
(2)配置Redis缓存
替换默认缓存配置,使用Redis作为缓存后端:
CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379/1", # 两个应用必须使用同一个Redis数据库实例 "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", # 生产环境建议添加密码:"PASSWORD": "your_redis_password", } } }
(3)切换会话引擎到Redis
替换原来的数据库会话存储,改用Redis:
# 替换默认的django.contrib.sessions.backends.db SESSION_ENGINE = "django.contrib.sessions.backends.cache" SESSION_CACHE_ALIAS = "default" # 指定使用上面配置的default缓存
(4)配置跨端口Cookie参数
因为两个应用同属localhost域名的不同端口,需要让Cookie能被两个端口共享:
SESSION_COOKIE_DOMAIN = ".localhost" # 点前缀表示允许同一域名下的所有端口共享Cookie SESSION_COOKIE_NAME = "sessionid" # 保持默认值,两个应用必须一致 SESSION_COOKIE_PATH = "/" SESSION_COOKIE_SECURE = False # 本地测试禁用HTTPS,生产环境启用HTTPS后设为True SESSION_COOKIE_HTTPONLY = True # 提升安全性,防止前端JS访问Cookie
三、验证效果
- 分别启动两个应用:
python manage.py runserver 8000和python manage.py runserver 8010。 - 在
localhost:8000登录用户,然后打开localhost:8010,检查request.user.is_authenticated是否为True,若为真则说明会话共享生效。
关键注意点
- 两个应用必须共享同一用户数据库(你已满足此条件),否则无法读取用户信息。
- Redis服务需保持稳定,生产环境建议配置持久化(RDB或AOF),避免重启后会话丢失。
- 若生产环境使用不同域名,需将
SESSION_COOKIE_DOMAIN设为共同的父域名(比如.example.com)。
内容的提问来源于stack exchange,提问作者Sharful Islam
相关产品推荐
相关产品推荐

