2016-07-28 39 views
0

Ich versuche, die jinja2_view Plugin zu verwenden, um eine Vorlage aus einem benutzerdefinierten Fehlerhandler wie folgt zu machen:Wie kann man benutzerdefiniertes HTML auf einer Flasche 404 Handler liefern?

from bottle import Bottle, abort, jinja2_view 

app = Bottle() 

@jinja2_view('index.html') 
@app.get('/') 
def index(): 
    abort(404) 

@jinja_view('404.html') 
@app.error(404) 
def handle404(error): 
    return error 

Aber das funktioniert nicht.

Ich habe versucht, einen String aus dem Handler wie diese Rückkehr:

from bottle import Bottle, abort, jinja2_view 

app = Bottle() 

@jinja2_view('index.html') 
@app.get('/') 
def index(): 
    abort(404) 


@app.error(404) 
def handle404(error): 
    return '<h1>Custom code</h1>' 

Es funktionierte, aber es ist nicht die bevorzugte Option.

Wie kann ich das machen?

Antwort

1

Sie können jederzeit Ihre eigene Jinja Umwelt wie folgt instanziiert:

from bottle import Bottle, abort, jinja2_view 
from jinja2 import Environment, PackageLoader 

env = Environment(loader=PackageLoader('yourapplication', 'templates')) 

app = Bottle() 

@jinja2_view('index.html') 
@app.get('/') 
def index(): 
    abort(404) 


@app.error(404) 
def handle404(error): 
    template = env.get_template('404.html') 
    return template.render() 

Das Schlimme an dieser aproach ist, dass die gesamte Konfiguration auf der Flasche jinja Plugin gemacht ist verloren, und Sie müssen diese erneut konfigurieren.

Gute Nachricht ist, dass es in der Flasche noch ein weiteres jinja-Plugin namens jinja2_template gibt, das nicht kommentiert, sondern in der Anfrage zurückgegeben werden soll.

from bottle import Bottle, abort, jinja2_view, jinja2_template 

app = Bottle() 

@jinja2_view('index.html') 
@app.get('/') 
def index(): 
    abort(404) 


@app.error(404) 
def handle404(error): 
    return jinja2_template('404.html') 

Also, wenn Sie den Code, um diese Änderung können Sie die Vorlage von Jinja richtig laden kann, die gleichen Konfigurationen aus der Flasche jinja-Plugin.

0

Decorators werden in umgekehrter Reihenfolge angewendet. In Ihrem Codebeispiel wenden Sie die Ansichtsdekoratoren nach die Route Decorators an, was bedeutet, dass die nicht verzierten Handlerfunktionen an die App gebunden sind und keine Vorlagen gerendert werden. Deine Route funktioniert auch nicht. Einfach die Reihenfolge der Dekorierer ändern:

from bottle import Bottle, abort, jinja2_view as view 

app = Bottle() 

@app.get('/') 
@view('index.html') 
def index(): 
    abort(404) 

@app.error(404) 
@view('404.html') 
def handle404(error): 
    return error