【发布时间】:2015-12-16 19:54:32
【问题描述】:
我刚刚在我的 Web 应用程序中启用了 Django 的每站点缓存(使用 Redis 作为我的缓存后端)并立即遇到了问题。我的网站包含一个用户个人资料页面,其中显示了用户的照片和他们的简历。我还有一个表格可以让他们更改照片和/或简历。如果用户上传新照片,我会为该照片创建一个新的唯一名称。如您所料,当用户进入该表单并上传新照片并且我重新显示他们的个人资料页面以便他们可以在提交新照片或简历之前对其进行查看时,该页面会显示他们的旧照片,因为我已经启用站点缓存。我可以禁用特定视图的缓存(即,对于这样的情况)还是必须禁用每个站点的缓存并在逐个视图的基础上实现它?这是我第一次使用缓存,我不确定我应该采取什么方法。我有另一个视图/模板,它显示了当前登录的所有用户,我预计那里会遇到同样的问题,即他们的旧照片在他们更改后将继续显示。
感谢您的建议。
【问题讨论】:
-
这是一个通用建议:使用适合大多数情况的方法,然后在需要时专门启用/禁用(取决于方法)。您还可以遵循“缓存失效”策略,其中某些操作会清除某些缓存。
-
我想我不明白的是,启用缓存后,如果用户转到他们的“更改个人资料”表单页面,更改他们的简历,提交表单,然后我重新呈现表单要显示新的简历内容,为什么表单页面上没有显示该内容?页面内容确实发生了变化,那么为什么 Django 会重新呈现以前的表单/页面?它不应该看到页面的内容发生了变化,因此不应该从缓存中获取页面吗?谢谢。
-
在 Django 文档中,看起来修改页面不会使缓存失效。总有一个打钱策略,使用基于上次修改
/profile?whatever=timestampstring的查询,丑陋,我知道。 -
或者试试
must_revalidate参数,比如@cache_control(must_revalidate=True, max_age=3600)