如何配置Django避免服务器重启时清除缓存?
解决Django服务器重启后会话丢失的问题
原因分析
你当前配置的SESSION_ENGINE = "django.contrib.sessions.backends.cache"会将用户会话存储在缓存中。如果使用的是Django默认的LocMemCache(本地内存缓存),服务器重启后内存中的缓存数据会被完全清空,直接导致用户会话失效、被迫登出。
解决方案
方案1:改用持久化缓存后端
将本地内存缓存替换为独立于Django进程的持久化缓存服务(如Redis、Memcached),这类服务的缓存数据不会因Django重启而丢失。
以Redis为例的配置步骤:
- 安装Redis缓存依赖:
pip install django-redis
- 在
settings.py中配置Redis作为默认缓存:
CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379/1", # 替换为你的Redis服务地址和数据库编号 "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", } } }
- 保持原有会话引擎配置不变:
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
方案2:使用缓存+数据库的混合会话引擎
Django内置的cached_db引擎会同时将会话数据存入缓存和数据库:缓存负责快速读取,数据库作为持久化备份。即使缓存因重启清空,系统也能从数据库中恢复会话数据。
配置步骤:
修改settings.py中的会话引擎:
SESSION_ENGINE = "django.contrib.sessions.backends.cached_db"
确保已执行过数据库迁移(python manage.py migrate),Django会自动创建django_session表用于存储会话备份数据。
方案3:直接使用数据库会话引擎
如果不需要缓存的性能优化,也可以直接将会话完全存储在数据库中,彻底避免缓存清空的影响:
SESSION_ENGINE = "django.contrib.sessions.backends.db"
同样需要确保已执行过数据库迁移,生成对应的会话存储表。
额外注意事项
- 使用持久化缓存服务时,需确保缓存服务本身在Django重启时保持运行状态。
- 采用
cached_db或db引擎时,数据库中会积累过期会话数据,可定期执行以下命令清理:
python manage.py clearsessions
内容的提问来源于stack exchange,提问作者logan_9997
相关产品推荐
相关产品推荐

