Маршрутизация ошибок 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)