2012-09-14 64 views
10

我有時不確定如何使用webapp2.redirectwebapp2重定向解釋

曾經有當我應該使用的 self.redirect("/blah")代替return self.redirect("/blah")

這裏是時間線的我的理解/猜時間:(有時我感到困惑,如果響應對象做一些事情,或者如果webapp2的做它)

  1. 我訪問我的網站的多線程www.mysite.com/name/robert,鉻發送GET請求 (讓我們假設這個請求是一個文本文件)
  2. webapp2的抓住這個「文本文件」並把它變成一個webapp2.Request。 webapp2也使一個新的webapp2.Response。
  3. 以某種方式,請求url被提供給路由器進行匹配(或者由webapp2或者響應中的 )。一個合適的RequestHandler實例化爲 。 RequestHandler的get()方法用 相應的參數調用。
  4. 整個這段時間裏只有一個請求和一個 響應。
  5. get()方法調用response.out.write(「hello world」)將 「hello world」添加到響應正文中?
  6. 的get()方法調用self.redirect( '/富')
  7. 事情發生
  8. 的get()方法調用self.out.write( 「再見世界」)
  9. 響應被髮送到包含的Hello World客戶,哪些食物補充,初步get函數輪空世界

例如:

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

什麼「東西發生」?我想路由器會找到/ foo /的RequestHandler。 foo的requestHandlers get()方法被稱爲之前對Request和Response做了哪些修改。請求是否被刪除並由新的GET請求取代?響應是否被刪除並由新的替換?在最初的請求處理程序中存在什麼上下文?代碼執行是否返回到初始請求處理程序get方法,如果是,那麼可能存在的上下文已恢復?

對不起,如果這是一個有點拗口,我試圖解釋,我想知道:)

什麼也許它本來就容易找點用例(該做什麼和不該做什麼)使用重定向。

回答

10

重定向方法實際上只是設置響應狀態和響應位置標題的一些有用的細節。直到將響應發送到遵循重定向的客戶端,才真正發生。如果在不希望運行的重定向後有更多的代碼,您只需返回調用重定向的結果即可避免運行更多代碼。

來源是很容易讀懂.. http://webapp2.readthedocs.io/en/latest/_modules/webapp2.html#redirect

+0

所以客戶得到302和跟蹤重定向。這似乎效率低下(需要兩個請求而不是一個)。如果每個人都重定向到/登錄說,我會認爲這個響應會返回登錄表單,並說它被重定向到一個響應,而不是兩個。 –

+1

只是爲了確認,foos get()方法直到客戶端瀏覽器重新定向後纔會被調用,新的請求返回到新的位置頭,這意味着foos get方法甚至可以在不同的服務器上調用。 –

+1

如果你想要一個內部重定向,你可以從你的代碼中調用另一個處理程序方法,例如,我將在後處理程序中更新一些東西,並返回self.get()作爲響應。問題在於,您要從不同的服務器請求的資源中返回內容。如果這對情況沒問題,那麼,好的。如果你做了重定向,那麼瀏覽器(或蜘蛛)知道它是什麼。至於重定向和提供新的響應,好的瀏覽器不會那樣工作。確認:是的,你會失去「hello world」和「bye world」到以太網(對瀏覽器用戶) – lecstor