15

Bottle.py には、HTTPError のスローを処理し、関数にルーティングするためのインポートが同梱されています。

まず、ドキュメントは私ができると主張しています(そしていくつかの例もそうです):

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,
}

app.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 に答える