Django FileBasedCache缓存导致登录跳转到他人账号问题及方案咨询
问题成因
你启用的全站FileBasedCache缓存方案默认会缓存所有GET、HEAD请求的响应结果,包含UserRedirectView返回的302重定向响应。首个访问该重定向视图的用户的个人资料页跳转地址会被写入缓存,后续所有请求该视图的用户都会直接返回已缓存的重定向地址,因此会出现跳转到其他用户资料页的问题。
如果UserDetailView、用户组专属活动列表这类用户私有页面也被纳入全站缓存,还会出现用户访问自己的URL时拿到其他用户缓存内容的异常。
可行解决方案与最佳实践
- 排除私有视图的公共缓存:给所有用户专属的视图(
UserRedirectView、UserDetailView、用户组活动列表视图等)添加never_cache装饰器,类视图可以通过method_decorator挂载到dispatch方法上,也可以在全站缓存配置中添加私有路由的排除规则,完全禁止这类路由被全站公共缓存存储,从根源上避免私有内容被公共缓存覆盖。 - 按用户/用户组维度拆分缓存:如果部分私有页面可缓存以提升性能,不要使用全局缓存规则,改用页面级缓存配置,通过
vary_on_cookie装饰器让缓存基于用户session cookie生成独立的缓存键,保证不同用户拿到的是自己的缓存内容;如果是同用户组内容一致的场景,可以自定义缓存键,将用户组ID作为缓存键的组成部分,同组用户共用一份缓存,兼顾性能和安全性。 - 拆分缓存策略避免一刀切:不要对全站所有路由启用统一缓存,按照内容属性拆分策略:
- 静态资源(CSS、JS、图片、未登录公共页面等)用公共缓存,可设置较长的缓存有效期
- 低实时性公共动态内容(比如公开活动列表)单独设置缓存时长,定期失效更新
- 用户私有内容设置
Cache-Control: private响应头,禁止公共代理/公共缓存存储,仅允许用户端本地缓存私有内容
- 补充其他性能优化手段:1核1GB配置的VPS除了缓存优化,可将静态资源交给Nginx处理,WSGI服务器改用Gunicorn搭配gevent异步模式,调整合理的worker进程数,不需要靠覆盖私有路由的缓存方案提升性能,规避数据串用风险。
内容的提问来源于stack exchange,提问作者A. Nurb
相关产品推荐
相关产品推荐

