【问题标题】:Setting up cache with Django to work around the "page has expired" IE problem使用 Django 设置缓存以解决“页面已过期”的 IE 问题
【发布时间】:2010-11-11 18:54:34
【问题描述】:

我遇到了一个熟悉的问题。我正在使用 Django-0.97,并且无法升级 - 尽管正在使用的 Django 版本不应该在问题的原因中发挥任何作用。

我有一个向用户显示表单的搜索视图,并且在通过 POST 提交表单时,执行繁重的计算并显示作为这些计算结果生成的项目列表。用户可以单击任何这些项目的“更多信息”链接以查看项目详细信息页面。

IE上的用户,一旦他们从搜索结果页面进入任何项目的项目详细信息页面,就会得到familiar“网页已过期,点击刷新按钮,yadda yadda yadda” 他们点击浏览器上的“返回”按钮时出错。遗憾的是,该网站的大部分用户使用 IE,不精通技术,并且抱怨这个问题。

认为设置cache backend 可以解决问题,我配置了一个简单的缓存后端。我在每个站点缓存和每个视图缓存之间进行了权衡,但无济于事。现在,我不太确定我是否正确设置了缓存。

任何可能有助于缓解问题的提示和建议将不胜感激。

谢谢。

更新(2009 年 7 月 20 日)

我使用 Fiddler 检查请求和响应的 HTTP 标头。 IE 在 POST 请求中发送 Pragma: no-cache 标头。作为请求结果生成的 HTTP 响应具有以下标头:

Cache-Control: public, max-age=3600
Date: someDateHere
Vary: Cookie

而且,是的,我没有使用 PRG 模式。

【问题讨论】:

    标签: django internet-explorer caching


    【解决方案1】:

    您可能会发现需要使用 PRG 模式 (Post/Redirect/Get)。使用这种模式,POST 的处理程序将:

    1. 执行繁重的计算,确定搜索结果,并将它们存储在用户会话中(或存储在用户会话键入的数据库中)。
    2. 向幂等页面发送带有重定向标头的响应,然后浏览器在重定向之后使用GET 获取该页面。

    当访问重定向到的页面时,服务器会显示搜索结果页面,该页面是根据会话中存储的数据计算得出的,并且位于与 POSTed 到的 URL 不同的 URL 上。您应该能够为此(搜索结果)页面使用正常的缓存标头,具体取决于您的搜索结果的波动性。

    【讨论】:

    • 默认情况下,这对他没有帮助,因为如果他 3xx 重定向到另一个页面,他仍然会得到“无缓存”请求行为。
    • 也许吧,但是 Post-Redirect-Get 仍然是一个很好的模式可以遵循,目前还不清楚他是否正在使用它。就 IE 的变幻莫测而言,我敢肯定你比我更熟悉它们 ;-)
    • 感谢您的回复,维奈。我目前没有使用 PRG 模式。
    • Vinay,感谢您的指点。我决定采用 PRG 模式。我之前已经在会话中存储了数据,但没有显示在浏览器通过 GET 获取的不同页面上。我添加了重定向和获取位,并使用会话数据来显示结果。这可以满足我的要求,而无需依赖缓存。
    【解决方案2】:

    在 RFC2616 下,“POST”不是幂等方法,这意味着浏览器不会重新发送请求,除非用户确认重新发送。因此,为了防止出现提示,您必须确保 CLIENT 缓存该页面。

    为此,请使用缓存控制标头:http://www.fiddler2.com/redir/?id=httpperf,并确保您没有发回任何 Vary 或 Pragma: no-cache 标头:http://blogs.msdn.com/ieinternals/archive/2009/06/17/9769915.aspx

    捕获 HTTP POST 的响应标头(例如使用 Fiddler)并用它们更新您的问题对您很有帮助。

    【讨论】:

    • 感谢您的回复,EricLaw。我已经更新了这个问题。您认为“Vary: Cookie”可能是问题的根源吗?
    • 是的,Vary: Cookie 绝对会导致 IE 将页面视为不可缓存。您可以通过简单地使用 Fiddler 删除 Vary 标头并查看它是否开始工作来轻松验证这是问题所在。
    • 再次感谢 EricLaw。正如我在所选答案下的 cmets 中解释的那样,我使用了 PRG 模式。这对我有用。 Fiddler 是一个不错的应用程序。我发现它非常有用。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 2011-05-16
    • 2011-10-31
    • 2018-11-08
    • 1970-01-01
    相关资源
    最近更新 更多