session默认存于客户端cookie中,flask和django均需配置redis实现服务端存储:flask用flask-session扩展并设session_type='redis';django则需配置session_engine、caches及session_cache_alias。

Session 在 Python Web 中到底存哪儿了?
默认情况下,Flask 和 Django 的 session 都是「客户端存储」——数据加密后塞进 Cookie 里,服务端不保存。这不是真·服务端会话,只是看起来像。真要服务端存、跨进程共享、支持大量用户,必须换后端存储,Redis 是最常用且靠谱的选择。
Flask-Session 怎么连上 Redis?
别直接操作 session 对象去存 Redis,要用 Flask-Session 扩展接管整个生命周期。它会自动把 session ID 映射到 Redis 的 key,值序列化后存进去。
-
pip install Flask-Session redis(注意:redis包是 Python 客户端,不是 Redis 服务本身) - 初始化时指定
SESSION_TYPE = 'redis',并用SESSION_REDIS传入redis.Redis()实例 - 务必设置
SECRET_KEY,否则签名失败,每次请求都新建 session - 如果 Redis 要密码或非默认端口,用
redis.Redis(host='...', port=..., password='...')构造,别拼 connection URL
示例关键配置:
app.config['SESSION_TYPE'] = 'redis' app.config['SESSION_REDIS'] = redis.Redis(host='127.0.0.1', port=6379, db=0) Session(app)
Django 怎么切到 Redis Session?
Django 原生支持,不用额外装包,但配置稍多。核心是改 SESSION_ENGINE 和补全 CACHES + SESSION_CACHE_ALIAS,因为 Django 的 Redis session 依赖 cache backend。
- 安装
django-redis(官方推荐,比原生redis包多一层适配):pip install django-redis -
SESSION_ENGINE设为'django.contrib.sessions.backends.cache'或更稳的'django.contrib.sessions.backends.cached_db' - 在
CACHES里定义一个叫'default'的 Redis cache(即使你只用来存 session),key 必须对得上SESSION_CACHE_ALIAS - 别漏掉
SESSION_COOKIE_AGE和SESSION_SAVE_EVERY_REQUEST,否则用户可能莫名其妙登出
常见错误现象:SessionStore object has no attribute 'cache' —— 就是 CACHES 没配,或名字没匹配上。
Redis Session 共享时要注意哪些坑?
多个服务实例共用一个 Redis,看似简单,实际容易栽在细节上。
- Flask 的
SESSION_KEY_PREFIX默认是'session:',如果多个 Flask 应用混用一个 Redis DB,得各自设不同前缀,否则 session 互相覆盖 - Django 的 session key 默认带
django.contrib.sessions前缀,但如果你用了cached_db,数据库表和 Redis 缓存要保持一致,否则查不到就回退到 DB,延迟飙升 - Redis 内存满了会触发淘汰策略,
volatile-lru不保 session,建议用allkeys-lru或直接设maxmemory-policy noeviction+ 监控告警 - 本地开发用
redis://localhost:6379/0,上线必须换真实地址;Docker 环境里别写127.0.0.1,要用宿主别名或 service 名
最常被忽略的一点:session 过期时间由服务端控制(Redis TTL),但 Cookie 自身也有 Max-Age。两者不一致时,用户可能前端还“看着在线”,后端已删 session,结果报 401 或空白页——得让两者同步,比如都设成 30 分钟。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











