34

abort()Flaskには、エラーが実際に発生したとき、またはを使用することにより、優れたエラーハンドラがあります。

Flaskのドキュメントから、エラー404ハンドラーの例があります。

@app.errorhandler(404)
def not_found(error):
    return render_template('404.html'), 404

だから、私は次のようなカスタムエラーコードを作成しようとしました

if False:
    abort(777)

@app.errorhandler(777)
def something_is_wrong(error):
    return render_template('777.html'), 777

しかし、それは機能せず、Werkzeugデバッガーは次のように言います:LookupError:777の例外はありません

私はこのようにすべきだというこの質問を見つけました:

if False:
    return '777 error', 777

残念ながら、上記のコードは白い画面を生成し、Werkzeugデバッガーでさえ出てきません

私は簡単にできることを知っています:

if False:
    return render_template('777.html')

ただし、を使用するとコードがよりクリーンになりますabort()。カスタムエラーコードを作成する方法はありますか?

4

4 に答える 4

46

可能な HTTP ステータス コードのリストは Internet Assigned Numbers Authority によって固定されているため、カスタム コードを追加することはできません。Werkzeug はこれを認識し、無意味なコードをブラウザに送信するのを阻止しようとします。ステータス コードのリストを調べて、エラーに一致するものを見つけ、それを使用します。

編集: Werkzeug/Flask にステータス コードを追加する

import werkzeug.exceptions as ex
from flask import Flask, abort

class PaymentRequired(ex.HTTPException):
    code = 402
    description = '<p>You will pay for this!</p>'

abort.mappings[402] = PaymentRequired

app = Flask(__name__)

@app.route('/')
def mainpage():
    abort(402)

@app.errorhandler(402)
def payme(e):
    return 'Pay me!'

app.run()
于 2012-09-05T16:40:31.460 に答える
15

質問の読み方によっては、これが役立つ場合があります。

特定の例外に対してカスタマー エラー ページの処理を追加する簡単な方法があります。これを行うことができます。

class MyCustom404(Exception):
    pass

@app.errorhandler(404)
def page_not_found(error):
    return render_template("errors/404.html"), 404

@app.errorhandler(MyCustom404)
def special_page_not_found(error):
    return render_template("errors/custom_404.html"), 404

...次に、必要なときに新しいハンドラーをトリガーします

raise MyCustom404

こちらのドキュメントを参照してください。

于 2013-11-11T10:37:48.017 に答える
9

私の場合、Flask==0.11.1 Werkzeug==0.11.10

たとえば、httpステータスコード451を中止します。

abort() をコード (abort(451) のような int 番号) とともに使用する場合は、最初に、HTTPException のサブクラスであるカスタム HTTPException を作成し、HTTPException を に追加する必要がありますdefault_exceptions

from werkzeug.exceptions import HTTPException, default_exceptions,  Aborter
class UnavailableForLegalReasons(HTTPException):
    code = 451
    description = 'BIG BROTHER IS WATCHING YOU'

default_exceptions[451] = UnavailableForLegalReasons
abort = Aborter()  # don't from flask import abort

@app.errorhandler(451)
def uflr(e):
    return e, 451

@app.route('/debug')
def debug():
    abort(451)

ブラウザでパスにアクセスすると、これを見ることができます ここに画像の説明を入力

しかし、http 理由フレーズは UNKNOWN です。

あなたはそれを変更することができます

from werkzeug.http import HTTP_STATUS_CODES
HTTP_STATUS_CODES[451] = 'Unavailable For Legal Reasons'  # or even empty

ここに画像の説明を入力

于 2016-07-29T00:10:27.850 に答える
0

Flask APIとそのエラー処理システムを使用することもできます。

http://www.flaskapi.org/api-guide/exceptions/

于 2014-11-21T07:13:45.270 に答える