Flaskには、abort()
を使用するか、エラーが実際に発生したときに、適切なエラーハンドラーがあります。
From 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:no exception for 777
私は この質問 を見つけました。
_if False:
return '777 error', 777
_
残念ながら、上記のコードは白い画面を生成し、Werkzeugデバッガーも表示されません
私は簡単にできることを知っています:
_if False:
return render_template('777.html')
_
しかし、abort()
を使用すると、コードがきれいになります。カスタムエラーコードを作成する方法はありますか?
可能な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()
質問の読み方によっては、これが役立つ場合があります。
特定の例外に対する顧客エラーページ処理を追加する簡単な方法があります。これを行うことができます。
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
ドキュメントはこちら を参照してください。
私の場合、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の理由句は不明です。
あなたはそれを変えることができます
from werkzeug.http import HTTP_STATUS_CODES
HTTP_STATUS_CODES[451] = 'Unavailable For Legal Reasons' # or even empty
Flask API とそのエラー処理システムを使用することもできます。