2016-03-04 73 views
0

我已經構建了gae webapps,而無需使用dispatch()方法。我在嘗試使用webapp2_extras.auth時遇到了這個問題,但我並不完全瞭解它的概念,以及它如何適合get()post()方法。根據其簡要文件:什麼是webapp2的dispatch()方法用於?

調度請求。 這將首先檢查在 匹配路線中是否定義了一個handler_method,如果沒有,將使用對應於 請求方法(get(),post()等)的方法。

我的理解是,它檢查我的路線,看看是否存在處理請求的處理程序類,但不是現有處理程序類中已定義的dispatch()方法?另外,是不是請求從客戶端調度

我對它的一些用例感到困惑,尤其是在webapp_extras.auth的環境中。

回答

1

source code可能是開始尋求理解這個問題的最好的地方。

如果我們只是看最後幾行,

try: 
    return method(*args, **kwargs) 
except Exception, e: 
    return self.handle_exception(e, self.app.debug) 

它調用的方法,如果該方法調用失敗的異常,它會調用handle_exception方法。所以,這解釋了handle_exception的魔力。

功能的其餘部分是

  1. 尋找在請求並找出要調用哪個方法(getpostputdelete,...)以及確定所述處理程序支持該方法。
  2. 找出是否應該將其他參數傳遞給處理程序。

至於它如何與webapp2_extras.auth玩,我覺得取決於你正在嘗試做的。我想你可以創建一個處理器子類來檢查用戶是否登錄:

class AuthedHandler(webapp2.RequestHandler): 
    def dispatch(self): 
     # Check of user is authenticated, otherwise redirect or 
     # return error response. 
     super(AuthedHandler, self).dispatch() 
+0

請求處理程序是否已知道要調用的方法?例如,如果一個表單是用'method =「get」'提交的,那麼這個請求是不是自動發送到'get(self)'方法? – puoyaahhh

+1

@haopei - WSGIApplication通過路由器(通過'default_dispatcher'方法)將請求分派給處理程序。一旦請求到達處理程序,就由處理程序決定請求對應的方法。 'dispatch'是負責挑選方法並調用它的方法。 – mgilson