2010-06-08 7 views
8

Descargo de responsabilidad: completamente nuevo en Python desde un fondo de PHP¿Cómo puedo matar una aplicación web de Python en GAE pronto después de una redirección?

Ok, estoy usando Python en Google App Engine con el marco de webapp de Google.

Tengo una función que importo ya que contiene elementos que deben procesarse en cada página.

def some_function(self): 
    if data['user'].new_user and not self.request.path == '/main/new': 
     self.redirect('/main/new') 

Esto funciona bien cuando lo llamo, pero ¿cómo puedo asegurarme de que la aplicación muera después de la redirección? No quiero procesar nada más. Por ejemplo he de hacer esto:

class Dashboard(webapp.RequestHandler): 
    def get(self): 
     some_function(self) 
     #Continue with normal code here 
     self.response.out.write('Some output here') 

quiero para asegurarse de que una vez que la redirección se hace en some_function() (que funciona bien), que ningún procesamiento se realiza en la función get() después de la redirección, ni tampoco se emite el mensaje "Algunos resultados aquí".

¿Qué debería estar mirando para que todo esto funcione correctamente? No puedo salir de la secuencia de comandos porque se necesita ejecutar el framework webapp.

Me doy cuenta de que es más que probable que solo estoy haciendo las cosas de la manera incorrecta en cualquier forma para una aplicación de Python, por lo que cualquier orientación sería de gran ayuda. Espero haberme explicado correctamente y alguien podrá orientarme en la dirección correcta.

Gracias

+1

Gran pregunta. Creo que esto es algo que cualquier persona que use el 'RequestHandler.redirect()' de webapp se topa cuando comienza a usarlo. –

Respuesta

4

¿Qué tal esto?

class Dashboard(webapp.RequestHandler): 
    def some_function(self): 
     if data['user'].new_user and not self.request.path == '/main/new': 
      self.redirect('/main/new') 
      return True 
     else: 
      return False 
    def get(self): 
     if not self.some_function(): 
      self.response.out.write('Some output here') 

Como referencia, si usted va a necesitar some_function() en un montón de RequestHandlers sería Pythonic para hacer una clase que sus otros RequestHandlers puede subclase de:

class BaseHandler(webapp.RequestHandler): 
    def some_function(self): 
     if data['user'].new_user and not self.request.path == '/main/new': 
      self.redirect('/main/new') 
      return False 
     else: 
      return True 

class Dashboard(BaseHandler): 
    def get(self): 
     if not self.some_function(): 
      self.response.out.write('Some output here') 
+0

¿Las buenas mentes piensan igual? :) –

+0

Como ya comenté en la otra respuesta, he estado devolviendo un booleano, pero lo has hecho un poco más limpio para mí y, en general, me ha abierto un poco la mente. Me gustan sus ideas sobre la configuración de una clase de la que los RequestHandlers pueden formar una subclase, lo haré :) Gracias por apuntarme en la dirección correcta de ser un verdadero jefe de Python. 6 años de experiencia que tuve en PHP ... solo unos pocos días en Python, ¡mucho que aprender! – Mike

+0

Soy nuevo en StackOverflow, esta fue la respuesta marcada como aceptada porque usaré tanto la parte booleana como la segunda recomendación sobre cómo ser más "pitónico" :) Muchas gracias a los dos. – Mike

4

que sugieren que regrese un valor lógico de some_function() en función de si la persona que llama debe continuar la ejecución o no. Ejemplo:

def some_function(self): 
    if data['user'].new_user and not self.request.path == '/main/new': 
     self.redirect('/main/new') 
     return True 
    return False 

class Dashboard(webapp.RequestHandler): 
    def get(self): 
     if some_function(self): 
      return 
     #Continue with normal code here 
     self.response.out.write('Some output here') 

También hay una alternativa un poco más complicado que podría ser útil si es some_function() varios niveles anidados de profundidad, o si es posible que tenga muchas funciones como este. La idea: generar una excepción que indique que desea detener el procesamiento y utilizar una subclase de webapp.RequestHandler que simplemente capte e ignore esta excepción. He aquí una idea aproximada de cómo podría ir:

class RedirectException(Exception): 
    """Raise this from any method on a MyRequestHandler object to redirect immediately.""" 
    def __init__(self, uri, permanent=False): 
     self.uri = uri 
     self.permanent = permanent 

class RedirectRequestHandler(webapp.RequestHandler): 
    def handle_exception(self, exception, debug_mode): 
     if isinstance(exception, RedirectException): 
      self.redirect(exception.uri, exception.permanent) 
     else: 
      super(MyRequestHandler, self).handle_exception(exception, debug_mode) 

Esto puede que sea un poco más fácil trabajar con some_function() (y hacer que sus otros controladores de solicitudes un poco más fácil de leer). Por ejemplo:

def some_function(self): 
    if data['user'].new_user and not self.request.path == '/main/new': 
     raise RedirectException('/main/new') 

class Dashboard(RedirectRequestHandler): 
    # rest of the implementation is the same ... 
+0

Dos soluciones excelentes, la segunda me abre un poco la mente con mi progreso de aprendizaje. Devolver un booleano fue como lo he estado haciendo, pero lo has negado un poco para mí, muchas gracias por tu respuesta. – Mike

+0

Para ser sincero, solo estoy entendiendo 10 minutos más tarde, está empezando a ser más claro, pero creo que todavía está pasando por alto. Lo investigaré, muchas gracias. – Mike

+0

El enfoque booleano es ciertamente más simple, y debería ser suficiente para casos simples (como el que presenta en su pregunta). Simplemente mantenga el enfoque de excepción en su bolsillo trasero y considérelo cuando el esquema booleano se vuelve más complicado (por ejemplo, funciones anidadas o muchas funciones como 'some_function()'). –

0

que sé esta pregunta es bastante antigua, pero estaba haciendo algo hoy y naturalmente intenté con otra solución sin pensarlo, funcionó bien pero me pregunto si habría algún problema al hacerlo de esta manera.

Mi solución ahora es simplemente devolver, devolver algo en realidad, pero utilizo "return False" en el sentido de que hay un problema con la solicitud, por lo que estoy imprimiendo un error o redireccionando a otra parte.

Al regresar, ya configuré la salida, etc., y estoy eliminando la función get() o post() anticipadamente.

¿Es esta una buena solución?

Cuestiones relacionadas