2011-08-24 2 views
14

Bottle.py viene fornito con un'importazione per gestire l'esecuzione di HTTPErrors e il routing verso una funzione.Bottle.py errore di routing

In primo luogo, le richieste di documentazione che possono (e così fanno alcuni esempi):

from bottle import error 

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

tuttavia, durante l'importazione di questo errore affermazione è irrisolto, ma che esegue l'applicazione ignora questo e mi indirizza al errore generico pagina.

Ho trovato un modo per aggirare questo ostacolo:

from bottle import Bottle 

main = Bottle() 

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

Ma questo codice mi impedisce di incorporare i miei errori il tutto in un modulo separato per il controllo della cattiveria che ne deriverebbe se li ho tenuto nel mio principale. modulo py perché il primo argomento deve essere un'istanza di bottiglia.

Così le mie domande:

  1. Qualcun altro ha sperimentato questo?

  2. perché non fa errore sembrano risolvere solo mio caso (ho installato da PIP installare bottiglia)?

  3. Esiste un modo semplice per importare il mio errore di routing da un modulo Python separato nell'applicazione principale?

risposta

24

Se si desidera incorporare i vostri errori in un altro modulo, si potrebbe fare qualcosa di simile:

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. quello era semplice e perfetto. – comamitc

7

questo funziona per me:

from bottle import error, run, route, abort 

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

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

run() 
0

In alcuni casi, trovo che sia meglio sottoclasse la bottiglia. Ecco un esempio di come farlo e aggiungere un gestore di errori personalizzato.

#!/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)