2011-02-04 63 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) 
相关问题