15

Bottle.py 附带一个导入来处理抛出的 HTTPErrors 和路由到函数。

首先,文档声称我可以(几个例子也是如此):

from bottle import error

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

但是,当导入此语句时,错误未解决,但在运行应用程序时会忽略这一点,只是将我引导到通用错误页面。

我找到了解决这个问题的方法:

from bottle import Bottle

main = Bottle()

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

但是这段代码阻止了我将我的错误全部嵌入到一个单独的模块中,以控制如果我将它们保存在我的 main.py 模块中会出现的问题,因为第一个参数必须是一个瓶子实例。

所以我的问题:

  1. 有没有其他人经历过这个?

  2. 为什么错误似乎只在我的情况下解决(我从pip install bottle 安装)?

  3. 有没有一种无缝的方法可以将我的错误路由从单独的 python 模块导入到主应用程序中?

4

3 回答 3

26

如果您想将错误嵌入到另一个模块中,您可以执行以下操作:

错误.py

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

handler = {
    500: custom500,
}

应用程序.py

from bottle import *
import error

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

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

run(app)
于 2011-08-24T12:08:31.830 回答
7

这对我有用:

from bottle import error, run, route, abort

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

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

run()
于 2011-08-24T12:05:56.703 回答
0

在某些情况下,我发现子类化 Bottle 更好。这是一个这样做并添加自定义错误处理程序的示例。

#!/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)
于 2016-01-30T17:18:51.147 回答