在python appengine中,如何从basehandler调用处理程序?

2024-05-14 17:52:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我想这样做:

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”会查看他们的会话并检查不完整的信息。在


Tags: self处理程序helloworldgetreturninitdef
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

WSGIApplication基于URL路由传入请求。例如

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

checkforspecialcase通过时,可以使用self.redirect('/special-case')。在

Basehandler可以实现一个get(),它检查特殊情况并重定向或调用自我观察(),并且每个处理程序都可以实现view()(或者您想调用它的任何东西),而不是get()。在

我不太喜欢为我的每个处理程序编写一个类,也不太喜欢如此显著地使用继承,所以我推荐如下滚动装饰器:

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)

相关问题 更多 >

    热门问题