4

誰かが HTML フォームを編集していて、セッションがタイムアウトしたとします。ユーザーがフォームに入力した内容を失うことなく、Django にその個人を再認証させるにはどうすればよいでしょうか?

スニペットDjango Snippets: Require login across whole siteは、サイト全体の認証を行う方法を示唆していますが、文字列の GET コンポーネントが失われ (つまり、request.path に含まれていないため)、POST データが確実に失われると予想されます。

これらの不便なタイムアウトを超えて POST と GET を保持するにはどうすればよいでしょうか。洗練された Web サイトは、これをインテリジェントに処理する傾向があることがわかりました。私は Django でそれを実行できるようにしたいと考えています (他のサイトと同様に、私は想像します!)。

考えをいただければ幸いです。ありがとうございました。

4

4 に答える 4

3

2 つの提案があります。

リダイレクト/ミドルウェア

ログイン要件を処理するためにミドルウェアを既に使用しているため、このミドルウェアを変更できます。または、ログイン ミドルウェアの後に呼び出される別のミドルウェア クラスを作成することもできます。これらのアイデアは絡み合っているため、既存のアイデアを変更する方が理にかなっています。

  1. ログインしていない場合は、ミドルウェアで GET および POST データをキャプチャし、セッションに保存します
  2. ユーザーが認証されている場合は、#1 で設定された値を確認します。存在する場合は、request.GET と request.POST を変更して反映させ、セッション データを削除します。

これは問題なく動作するはずで、多くの人が便利だと思います。djangosnippets.orgへの素晴らしい投稿になるでしょう。

アヤックスのテクニック

フォーム処理がすでに整っている場合、これはあまり実用的ではありませんが、ユーザー エクスペリエンスを向上させることができます。非同期で POST する場合、Javascript ハンドラーは「ログインが必要です」という応答コードを認識し、ログインを要求するポップアップ ダイアログを表示できます。完了すると、ユーザーはフォームを再送信できます。

于 2009-02-25T02:23:22.947 に答える
2

正確にはDjango固有ではありませんが、HTTP(ステートレス)固有です... POSTの処理中にリダイレクトを発行してシステムが終了し(元のPOSTからGETに切り替える)、データを失うリスクがある場合は、データをどこかに保存する必要があります(db、memcachedなど)、それらが保存されているキーを認証(またはその他の)プロセスで実行できるようにします。

最も単純なのはCookieで、キーを気にする必要はありません。より困難ですが、より防弾(read-oly Cookie jarに対して)は、URLのキーであり、ユーザーは要求から要求へとリダイレクトされ、連続してリレーされます(ほぼ10年前のソリューションのSESSIONのように)。

認証(または他のプロセス)が完了すると、渡されたキー(CookieまたはGET要求変数のいずれか)によってデータストアからデータ(および中断されたプロセス)を選択できます。

于 2009-02-24T23:35:57.390 に答える
2

すべてのフォームにハンドラーを追加onsubmitして、JS を介してセッションをチェックし、続行する前にログインを促します。この方法では、ユーザーが再度ログインする前にフォームの送信は実際には行われません。

また、ログインしているユーザーがセッション全体で同じであることを確認してください。

于 2009-02-24T22:33:18.430 に答える
0

私は一般的にセッションが好きではありませんが、認証されたサイトではすでにセッションを使用していると思うので、上記の答えがあなたのアプローチに当てはまるかもしれません.

セッションがなければ、ダニエルの回答と同様のことを行います。つまり、ミドルウェアで元の POST/GET をキャッチしますが、投稿された情報を含めるようにリダイレクトを変更します。

これは GET の方が簡単で、通常はログイン URL のリダイレクト コンポーネントでエンコードされた完全な GETstring です。

POST の場合は、小さなフォームでは問題なく動作する get メソッドに変換できますが、URL が長くなりすぎる大きなフォームの場合は、rePOST を実行し、データをログイン フォームに投稿してエンコードし、単一のフォームに保存します。非表示 (実際には .net ビューステートにほぼ似ています)

django でこれを行うのは、リダイレクトを行うことができないため注意が必要です。そのため、ミドルウェアを使用してログイン ビューを手動で呼び出し、そこから HttpResponse に書き込みます。EDITこれをさらに調べた後、 Jerry Strattonによって発見されたように、djangoの魔法の管理側にはすでに同様のものが実装されているようです

良いオプションのように見えます。試してみてフィードバックします。

于 2009-02-25T10:41:24.200 に答える