2011-08-24 14 views
14

Bottle.py se envía con una importación para controlar arrojar HTTPErrors y enrutar a una función.enrutamiento de error Bottle.py

En primer lugar, las reclamaciones de documentación que pueden (y lo hacen varios ejemplos):

from bottle import error 

@error(500) 
def custom500(error): 
    return 'my custom message' 

sin embargo, al importar este error comunicado no se ha resuelto, pero en el funcionamiento de la aplicación ignora esto y me dirige al error genérico página.

He encontrado una manera de evitar esto:

from bottle import Bottle 

main = Bottle() 

@Bottle.error(main, 500) 
def custom500(error): 
    return 'my custom message' 

Pero este código me impide la incrustación de mis errores todo en un módulo separado para controlar la porquería que se produciría si yo los guardaba en mi principal. módulo py porque el primer argumento tiene que ser una instancia de botella.

Así que mis preguntas:

  1. Alguien más ha experimentado esto?

  2. ¿por qué no error parecen resolver sólo en mi caso (he instalado desde PIP instalar botella)?

  3. ¿Existe una forma sencilla de importar mi enrutamiento de error desde un módulo de python separado a la aplicación principal?

Respuesta

24

Si desea incrustar sus errores en otro módulo, se podría hacer algo como esto:

error.py

def custom500(error): 
    return 'my custom message' 

handler = { 
    500: custom500, 
} 

app.py

from bottle import * 
import error 

app = Bottle() 
app.error_handler = error.handler 

@app.route('/') 
def divzero(): 
    return 1/0 

run(app) 
+0

wow. eso fue simple y perfecto. – comamitc

7

Esto funciona para mí:

from bottle import error, run, route, abort 

@error(500) 
def custom500(error): 
    return 'my custom message' 

@route("/") 
def index(): 
    abort("Boo!") 

run() 
0

En algunos casos, me parece mejor que la subclase de botella. Aquí hay un ejemplo de cómo hacer eso y agregar un controlador de error personalizado.

#!/usr/bin/env python3 
from bottle import Bottle, response, Route 

class MyBottle(Bottle): 
    def __init__(self, *args, **kwargs): 
     Bottle.__init__(self, *args, **kwargs) 
     self.error_handler[404] = self.four04 
     self.add_route(Route(self, "/helloworld", "GET", self.helloworld)) 
    def helloworld(self): 
     response.content_type = "text/plain" 
     yield "Hello, world." 
    def four04(self, httperror): 
     response.content_type = "text/plain" 
     yield "You're 404." 

if __name__ == '__main__': 
    mybottle = MyBottle() 
    mybottle.run(host='localhost', port=8080, quiet=True, debug=True) 
Cuestiones relacionadas