2011-02-04 64 views
1

我想要做這樣的事情:如何從python appengine中的basehandler調用處理函數?

class Basehandler(webapp.RequestHandler): 

    def __init__(self): 
    if checkforspecialcase: #check something that always needs to be handled 
     return SpecialCaseHandler.get() 

class NormalHandler(Basehandler): 

    def get(self): 
    print 'hello world' 
    return 

class SpecialCaseHandler(Basehandler): 

    def get(self): 
    print 'hello special world' 
    return 

的想法是,不管是什麼處理程序最初稱,如果某種情況下得到滿足,我們基本上切換到另一個處理程序。

我對python非常陌生,所以我不確定我想要做什麼是可能的。或者這是否是最好的方法。我真正想要做的是確保向某人展示完整的個人資料頁面,如果他們已經開始註冊過程但尚未完成註冊過程......無論他們提出了什麼要求。因此,「checkforspecialcase」查看他們的會話並檢查不完整的信息。

回答

3

爲了保持乾燥,使用Template Method pattern

class BaseHandler(webapp.RequestHandler): 
    def DoGet(self, *args): 
     ''' defined in derived classes, actual per-handler get() logic''' 
     pass 

    def get(self, *args): 
     # don't get caught in endless redirects! 
     if specialCase and not self.request.path.startswith('/special'): 
      self.redirect('/special') 
     else: 
      self.DoGet(*args) 

class NormalHandler(BaseHandler): 
    def DoGet(self, *args): 
     # normal stuff 

class SpecialHandler(BaseHandler): 
    def DoGet(self, *args): 
     # SPECIAL stuff 
3

WSGIApplication根據URL路由傳入的請求。例如,

application = webapp.WSGIApplication(
       [('/special-case', SpecialCaseHandler)]) 

checkforspecialcase通行證,就可以使用self.redirect('/special-case')

+0

這是我嘗試的第一件事,但沒有去。如果在上面的條件之後放置self.redirect('/ special-case'),則會出現以下錯誤:「AttributeError:'NormalHandler'對象沒有'request'屬性。」只有在您調用它時,重定向才起作用在get()或post()方法中,但不是來自初始化方法。 – 2011-02-05 06:21:59

+0

是的,沒錯。你爲什麼不在`get`方法中使用這個條件呢?爲什麼我們需要`__init__`? – dheerosaur 2011-02-05 06:39:55

0

你的Basehandler可以實現一個get()來檢查特殊情況,並重定向或調用self.view(),每個處理程序可以實現vi​​ew()(或任何你想稱之爲的)比得到()。

我不是很喜歡寫一個類爲每個我的處理程序,或使用繼承這麼明顯,所以我建議滾動裝飾這樣的:

routes = [] 

def get (route): 
    def makeHandler (handle, *args, **kwargs): 
     class Handler (webapp.RequestHandler): 
      def get (self, *args, **kwargs): 
       shouldRedirectToCompleteProfile = # do your test 
       if shouldRedirectToCompleteProfile: 
        self.redirect('/special-case') 
       else: 
        handle(self, *args, **kwargs) 
     routes.append((route, Handler)) 
     return Handler 
    return makeHandler 

def post (route): 
    def makeHandler (handle, *args, **kwargs): 
     class Handler (webapp.RequestHandler): 
      def post (self, *args, **kwargs): 
       handle(self, *args, **kwargs) 
     routes.append((route, Handler)) 
     return Handler 
    return makeHandler 

@get('/') 
def home (ctx): 
    # <...> 

@get('/whatever/(.*)/(.*)') 
def whatever (ctx, whatever0, whatever1): 
    # <...> 

@post('/submit') 
def submit (ctx): 
    # <...> 

application = webapp.WSGIApplication(routes) 
相關問題