Маршрутизация ошибок Bottle.py

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, потому что первый аргумент должен быть экземпляром бутылки.

Итак, мои вопросы:

  • Кто-нибудь еще испытал это?

  • Почему ошибка, кажется, не разрешена только в моем случае (я установил из установочной бутылки)?

  • Есть ли простой способ импортировать мою маршрутизацию ошибок из отдельного модуля python в основное приложение?

Ответы

Ответ 1

Если вы хотите встроить свои ошибки в другой модуль, вы можете сделать что-то вроде этого:

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)

Ответ 2

Это работает для меня:

from bottle import error, run, route, abort

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

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

run()

Ответ 3

В некоторых случаях я считаю, что лучше подклассы 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)