Как вы вызываете обработчик из вашего базового обработчика в python appengine? - PullRequest
1 голос
/ 04 февраля 2011

Я бы хотел сделать что-то вроде этого:

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 ]

3 голосов
/ 06 февраля 2011

Чтобы сохранить вещи СУХИМ, используйте шаблон Template Method

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 голосов
/ 04 февраля 2011

WSGIApplication маршрутизирует входящие запросы на основе URL.Например,

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

Когда проходит checkforspecialcase, вы можете использовать self.redirect('/special-case').

0 голосов
/ 06 февраля 2011

Ваш Basehandler мог бы просто реализовать get (), который проверяет особый случай и либо перенаправляет, либо вызывает self.view (), и каждый обработчик может реализовать 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...