我遇到了一个熟悉的问题。我正在使用 Django-0.97,并且无法升级——尽管正在使用的 Django 版本不应该在问题的原因中发挥任何作用。
我有一个搜索 View ,它向用户呈现一个表单,并且在通过 POST 提交表单时,执行大量计算并显示作为这些计算结果生成的项目列表。用户可以单击任何这些项目的“更多信息”链接来查看项目详细信息页面。
IE 上的用户,一旦进入搜索结果页面中任何项目的项目详细信息页面,就会获得 familiar “网页已过期,请点击刷新按钮,yadda yadda yadda”错误当他们点击浏览器上的“后退”按钮时。遗憾的是,该网站的大多数用户都使用 IE,不懂技术,并且提示这个问题。
认为设置 cache backend也许可以解决这个问题,我配置了一个简单的缓存后端。我尝试了每个站点缓存和每个 View 缓存,但没有效果。现在,我不太确定我是否正确设置了缓存内容。
任何可能有助于缓解问题的提示、建议将不胜感激。
谢谢。
更新(2009 年 7 月 20 日)
我使用 Fiddler 检查请求和响应的 HTTP header 。 IE 在 POST 请求中发送 Pragma: no-cache
header 。作为请求结果生成的 HTTP 响应具有以下 header :
Cache-Control: public, max-age=3600
Date: someDateHere
Vary: Cookie
而且,是的,我没有使用 PRG 模式。
最佳答案
您可能会发现需要使用 PRG 模式 ( Post/Redirect/Get )。使用此模式,POST
的处理程序将:
- 执行繁重的计算,确定搜索结果,并将它们存储在用户的 session 中(或将它们存储在由用户 session 键入的数据库中)。
- 将带有重定向 header 的响应发送到幂等页面,然后浏览器在遵循重定向时使用
GET
获取该页面。
访问重定向到的页面时,服务器会显示搜索结果页面,该页面是根据 session 中存储的数据计算得出的,并且显示的 URL 与 POST
发送到的 URL 不同。您应该能够为此(搜索结果)页面使用正常的缓存 header ,具体取决于您的搜索结果的不稳定程度。
关于django - 使用 Django 设置缓存来解决 "page has expired"IE 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1144562/