4

サイト検索に使用するフォームを含むページがあります。フォームは POST 動詞を使用して、検索するデータを送信します。検索結果は、送信後にフォームの下に表示されます。

IE の「ページの有効期限が切れています」という問題を解決するために、いわゆる PRG パターン (http://en.wikipedia.org/wiki/Post/Redirect/Get) を使用します。したがって、同じ URL にリダイレクトするビューの post() メソッドから django.shortcuts.redirect() を返します。

問題は、本番環境では、302 応答の後に送信された GET 要求に関連付けられた異なるセッション ID が表示されることです。結果をページに分割できるようにフォームをセッションに保存するため、一貫性のない結果が得られます。

apache/mod_wsgi で django を実行しています。apache は最大 3 つのプロセスを実行するように構成されています。

httpd を再起動した直後には発生せず、httpd プロセスによって消費されるメモリ量が制限に達した後に発生し始めるようです。

送信ボタンを繰り返し押してこれを確認すると、セッションからフォームが取り込まれ、入力した検索文字列を確認できます。セッションが変更されると、フォームは空白に戻ります。そのため、これが発生し始めると、フォームは 2 回続けて正常に入力され、3 回目に送信を押すと空白が返されます。これは、サーバーが新しいセッション Cookie を返したことを意味します。これは ServerLimit 設定と関係があるようです。

なにが問題ですか?何か案は?

ありがとう

コンスタンチン

4

3 に答える 3

1

302 の代わりに HTTP 303 See Other 応答を使用してみましたか?

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

于 2011-08-16T18:09:40.587 に答える
1

Django Sessions アプリを正しく使用していますか?

その場合、現在のセッション ID を Cookie に保存します。この Cookie の名前は設定で指定され、SESSION_COOKIE_NAMEデフォルトで sessionid になります。この問題は Firefox では発生していないため、セッションの処理と Django 内のストレージが正常に機能していると想定しても問題ないと思います。

ここで最も可能性の高い原因は、IE が sessionid Cookie を失ったり削除したりして、リダイレクト後に新しいセッションを開始することです。この件に関する簡単なグーグルは、これを確認しているようです。

関連情報は次の場所で確認できます。

さて、実際にあなたの問題を解決するために。Django は、実際に必要でない限り (つまり、セッション データを設定する場合)、セッション Cookie を設定しません。POST 時にセッション データを設定する唯一の場所がビュー内にある場合、IE はセッション ID を設定する Cookie を破棄します。

したがって、迅速で簡単な応急処置は、GET 中にジャンク データ (またはデフォルト値?) をセッションに保存して、POST の前に元々フォームを表示することです。これにより、IE は sessionid Cookie を取得し、動作するはずです。

于 2011-08-17T17:35:37.860 に答える
0

IE は、302 リダイレクトを取得すると、新しい接続を開きます。これが、302 がページの有効期限切れの問題を解決する理由です。しかし、それはまた、あなたが新しい「セッション」を提供していることを意味します.

接続に依存する以外に、302 経由でセッションを追跡するには、他のメカニズムが必要です。

于 2011-08-05T01:44:55.427 に答える