2016-07-28 3 views
0

Я пытаюсь использовать jinja2_view плагин для отображения шаблона из обработчика ошибок, как это:Как доставить пользовательский HTML на бутылку 404 Handler?

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 

Но это не работает.

Я пытался возвращать строку из обработчика так:

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>' 

Он работал, но это не является предпочтительным вариантом.

Как я могу сделать эту работу?

ответ

1

Вы всегда можете создать экземпляр свой дзиндзя среды, как это:

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() 

Плохая вещь об этом ПОДХОД в том, что все настройки сделаны на бутылке джинджа плагин теряется, и вы должны настроить это снова.

Хорошей новостью является то, что в бутылке имеется другой плагин jinja, названный jinja2_template, который не должен быть аннотирован, но должен быть возвращен в запросе.

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') 

Так что, если вы можете изменить код для этого вы можете загрузить шаблон из дзиндзя правильно, используя ту же конфигурацию из бутылки джинджи плагин.

0

Декораторы применяются в обратном порядке. В вашем примере кода вы применяете декораторы после декораторов маршрута, что означает, что функции декодерированного обработчика привязаны к приложению, и никакие шаблоны не отображаются. Ваш маршрут не будет работать. Просто переключите порядок декораторов:

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 
Смежные вопросы