¿Cómo llamas a un manejador desde tu manejador base en la aplicación python?

Me gustaría hacer algo como esto:

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 

La idea es que no importa a qué manejador se llame inicialmente, si se cumple un determinado caso, básicamente cambiamos a otro manejador.

Soy bastante nuevo en Python, así que no estoy seguro de si lo que estoy tratando de hacer es posible. O si este es el mejor enfoque. Lo que realmente estoy tratando de hacer es asegurarme de mostrarle a alguien la página de completar su perfil si ha comenzado el proceso de registro pero no lo ha completado … no importa qué solicitud estén haciendo. Así que el “checkforspecialcase” revisa sus sesiones y busca información incompleta.

Para mantener las cosas en seco, use el patrón Método de plantilla

 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 enruta las solicitudes entrantes basadas en la URL. Por ejemplo,

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

Cuando se pasa checkforspecialcase , puede usar self.redirect('/special-case') .

Tu Basehandler podría implementar un get () que verifica el caso especial y redirige o llama a self.view (), y cada controlador podría implementar view () (o como quieras llamarlo) en lugar de get () .

Realmente no me gusta escribir una clase para cada uno de mis manejadores, o usar la herencia de manera tan notoria, por lo que recomiendo decoradores con ruedas como estos:

 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)