django官方未提供redis后端,session_engine只能设为db、cache或cached_db;要存redis必须用django-redis配置caches,再通过cache/cached_db引擎间接实现。

不能直接用 redis-py 实例配 Django Session —— 你写 redis.Redis(...) 再存 key,request.session 依然走默认数据库或内存,根本不会同步到 Redis,也不会受 SESSION_COOKIE_AGE 控制。
为什么 SESSION_ENGINE = "django.contrib.sessions.backends.redis" 会报错
Django 官方从没提供 django.contrib.sessions.backends.redis 这个后端类。这个字符串在任何 Django 版本(包括 5.0)中都不存在,硬写进去会导致 ImportError 或 ImproperlyConfigured。网上搜到的这类配置,基本是混淆了旧第三方包(如 redis_sessions)或过时教程。
-
SESSION_ENGINE只接受 Django 自带的几个路径:django.contrib.sessions.backends.db、cache、cached_db - 想让 session 落 Redis,必须靠缓存后端“间接承载”,即:用
django-redis实现django.core.cache接口,再让cache类型的 session 去用它 - 所谓“Redis Session 后端”本质是缓存后端 + session 引擎的组合,不是独立模块
CACHES 配置漏掉 /db 编号或密码格式错,session 就不写 Redis
LOCATION 字符串必须带数据库编号(如 /1),且密码要按 URL 规范写。错一个字符,django-redis 会静默降级到本地内存缓存,redis-cli keys "session:*" 查不到任何东西,但请求也不报错。
- 正确写法:
redis://:mypassword@127.0.0.1:6379/1(密码前冒号不能少,无用户名就留空) - 错误写法:
redis://mypassword@127.0.0.1:6379/1(缺冒号 → 认成用户名)、redis://127.0.0.1:6379(缺/1→ 默认连 db 0,但你可能没开) - 调试技巧:在 shell 中运行
from django.core.cache import cache; cache.set("test", "ok", 10),再redis-cli get "test"确认是否真连上了
选 cache 还是 cached_db?生产环境别只用 cache
SESSION_ENGINE = "django.contrib.sessions.backends.cache" 表示 session 只存 Redis,不落库。Redis 一重启、OOM 被驱逐、key 过期策略误配,所有用户立刻登出 —— 这不是高并发优化,是单点故障放大器。
- 开发/测试可用
cache,响应快、清空方便 - 生产必须用
cached_db:写 session 时同时写 Redis + DB;读时优先 Redis,失效或未命中才查 DB,兜底不丢数据 - 别忘了配
SESSION_CACHE_ALIAS = "default",否则它不知道该用哪个缓存配置
Session 写进去了但 redis-cli 查不到?检查过期逻辑和连接池
常见假象:浏览器有 sessionid Cookie,Django 日志也没报错,但 redis-cli keys "session:*" 返回空。大概率是 TTL 没设上,或者连接异常导致 set 成功但 expire 失败。
- Django 的
cache后端靠cache.set(key, val, timeout)一次性发指令,django-redis必须支持原子性SETEX或SET + EXPIRE。老版本或自定义 client class 可能不兼容 - 确认
OPTIONS["CLIENT_CLASS"]是django_redis.client.DefaultClient,不是自己写的包装类 - 加一行
"CONNECTION_POOL_KWARGS": {"retry_on_timeout": True},避免网络抖动导致 expire 丢指令
最易被忽略的是:哪怕所有配置都对,如果 MIDDLEWARE 里 SessionMiddleware 被注释或顺序错位(比如放在 SecurityMiddleware 之后但没设 SECURE_PROXY_SSL_HEADER),session 也根本不会初始化 —— 连 request.session 都是空对象,更别说写 Redis。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











