4

我有一个带有用于站点搜索的表单的页面。该表单使用 POST 动词来提交要搜索的数据。提交后,搜索结果显示在表单下方。

为了解决 IE 上的“页面已过期”问题,我使用了所谓的 PRG 模式 (http://en.wikipedia.org/wiki/Post/Redirect/Get)。所以我从我视图的 post() 方法返回 django.shortcuts.redirect() ,该方法重定向到相同的 URL。

问题是,在生产中,我看到与 302 响应后发送的 GET 请求相关的不同会话 ID。由于我将表单存储在会话中以便能够将结果拆分为页面,因此我得到的结果不一致。

我在 apache/mod_wsgi 下运行 django。apache 配置为最多运行 3 个进程。

它不会在我重新启动 httpd 后立即发生,并且它似乎是在 httpd 进程消耗的内存量达到某个限制后开始发生的。

我通过反复按下提交按钮来检查这一点,表单从会话中填充,因此我可以看到我输入的搜索字符串。当会话更改时,表单返回空白。因此,当这种情况开始发生时,表单会连续成功填充 2 次,当我第三次按下提交时,它返回空白,这意味着服务器返回了新的会话 cookie。这似乎与 ServerLimit 设置有关。

怎么了?有任何想法吗?

谢谢

康斯坦丁

4

3 回答 3

1

您正在使用 Django Sessions 应用程序正确吗?

如果是这种情况,那么它将当前会话 ID 存储在一个 cookie 中,该 cookie 的名称由设置指定,SESSION_COOKIE_NAME并且默认为 sessionid。由于您在 Firefox 中没有遇到此问题,我相信可以安全地假设您在 Django 中的会话处理和存储工作正常。

这里最可能的罪魁祸首是 IE 正在丢失/删除 sessionid cookie,导致它在重定向后启动新会话。关于这个主题的快速谷歌似乎证实了这一点。

您可以在以下位置查看一些相关信息:

现在,为了真正解决你的问题。Django 不会设置会话 cookie,除非它实际上也需要(即如果您设置会话数据)。如果您设置会话数据的唯一位置是 POST 时的视图中,那么 IE 将丢弃设置 sessionid 的 cookie。

因此,一个快速简单的创可贴将只是在 GET 期间将一些垃圾数据(或默认值?)保存到会话中,以在 POST 之前显示最初的表单,IE 将获取 sessionid cookie,并且事情应该可以工作。

于 2011-08-17T17:35:37.860 回答
1

您是否尝试过使用 HTTP 303 See Other 响应而不是 302?

http://tumblr.jonthornton.com/post/7902581999/preventing-form-re-submission-with-http-303-redirects

于 2011-08-16T18:09:40.587 回答
0

IE 在获得 302 重定向时打开一个新连接。这就是为什么 302 解决了您的页面已过期问题。但这也意味着您正在服务一个新的“会话”。

除了依赖于连接之外,您还需要一些其他机制来跟踪跨 302 的会话。

于 2011-08-05T01:44:55.427 回答