如何在瓶子 404 Handler 上交付自定义 HTML?

How to deliver custom HTML on a bottle 404 Handler?

我正在尝试使用 jinja2_view 插件从自定义错误处理程序呈现模板,如下所示:

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

它有效,但不是首选。

我怎样才能完成这项工作?

您始终可以像这样实例化您自己的 Jinja 环境:

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

这种方法的缺点是所有在 bottle jinja 插件上所做的配置都丢失了,你必须重新配置它。

好消息是 bottle 中还有另一个 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')

因此,如果您可以将代码更改为此,您就可以使用 bottle jinja 插件中的相同配置从 jinja 正确加载模板。

装饰器的应用顺序相反。在您的代码示例中,您在 之后应用视图装饰器 路由装饰器,这意味着未装饰的处理程序函数绑定到应用程序并且不呈现任何模板。您的 get-route 也不起作用。只需切换装饰器的顺序:

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