12

webapp2.redirect の使い方がわからないことがあります。

self.redirect("/blah")代わりに使うべき時はあります かreturn self.redirect("/blah")

これがタイムラインの私の理解/推測です:(応答オブジェクトが何かを行うのか、それともwebapp2がそれを行うのかについて時々混乱します)

  1. マルチスレッド Web サイト www.mysite.com/name/robert にアクセスすると、chrome が GET リクエストを送信します (このリクエストがテキスト ファイルであると仮定します)。
  2. webapp2 はこの「テキスト ファイル」を取得し、webapp2.Request に変換します。webapp2 は、新しい webapp2.Response も作成します。
  3. どういうわけか、要求の URL がルーターに渡されて一致します (webapp2 または応答のいずれかによって)。適切な RequestHandler がインスタンス化されます。RequestHandler の get() メソッドは、適切な引数で呼び出されます。
  4. この間ずっと、1 つの要求と 1 つの応答しかありませんでした。
  5. get() メソッドは response.out.write("hello world") を呼び出し、"hello world" を応答本文に追加しますか?
  6. get() メソッドは self.redirect('/foo') を呼び出します
  7. 何かが起こる
  8. get() メソッドは self.out.write("bye world") を呼び出します
  9. hello world、追加された食べ物、bye world を含む応答がクライアントに送信されます。

最初の get 関数の例:

def get():
    self.write('hello world')
    self.redirect('/foo')
    self.write('bye world')

どんな「ことが起こる」?ルーターが /foo/ の RequestHandler を見つけたとします。foo の requestHandlers get() メソッドが呼び出される前に、リクエストとレスポンスに対して行われる変更。リクエストは削除され、新しい GET リクエストに置き換えられていますか? 応答は削除され、新しい応答に置き換えられますか? 最初のリクエスト ハンドラに存在していたコンテキストは何ですか? コードの実行は最初のリクエスト ハンドラの get メソッドに戻りますか? もしそうなら、存在していた可能性のあるコンテキストは復元されますか?

申し訳ありませんが、これが少し口が悪い場合は、知りたいことを説明しようとしました:)

おそらく、代わりにリダイレクトを使用するいくつかの使用例 (すべきこととすべきでないこと) を尋ねる方が簡単だったでしょう。

4

1 に答える 1

11

リダイレクト メソッドは、実際には、レスポンス ステータスとレスポンス Location ヘッダーの設定に関する便利な情報にすぎません。リダイレクトに続くクライアントに応答が送信されるまで、実際には何も起こりません。リダイレクトの後に実行したくないコードがさらにある場合、それ以上のコードが実行されるのを避けるためだけに、リダイレクトを呼び出した結果を返す必要があります。

ソースは非常に読みやすい.. http://webapp2.readthedocs.io/en/latest/_modules/webapp2.html#redirect

于 2012-09-14T10:07:31.070 に答える