python flaskサーバーを使用して、abortコマンドでhttpエラー応答をスローし、カスタム応答文字列とカスタムメッセージを使用できるようにしたい体
@app.errorhandler(400)
def custom400(error):
response = jsonify({'message': error.message})
response.status_code = 404
response.status = 'error.Bad Request'
return response
abort(400,'{"message":"custom error message to appear in body"}')
ただし、error.message変数は空の文字列として表示されます。カスタムエラーハンドラーを使用して、中止関数の2番目の変数にアクセスする方法についてのドキュメントを見つけることができないようです。
flask/__init__.py
を見ると、abort
が werkzeug.exceptions
から実際にインポートされていることがわかります。 Aborter
class を見ると、数値コードで呼び出されると、特定のHTTPException
サブクラスが検索され、Aborter
インスタンスに提供されたすべての引数で呼び出されることがわかります。 HTTPException
を見ると、 行85-89 に特に注意を払って、HTTPException.__init__
に渡される2番目の引数が@dirnとしてdescription
プロパティに格納されていることがわかります。指摘した。
description
プロパティからメッセージにアクセスできます。
@app.errorhandler(400)
def custom400(error):
response = jsonify({'message': error.description['message']})
# etc.
abort(400, {'message': 'custom error message to appear in body'})
または、説明をそのまま渡すだけです:
@app.errorhandler(400)
def custom400(error):
response = jsonify({'message': error.description})
# etc.
abort(400, 'custom error message to appear in body')
人々はabort()
に頼りすぎています。真実は、エラーを処理するより良い方法があるということです。
たとえば、次のヘルパー関数を作成できます。
def bad_request(message):
response = jsonify({'message': message})
response.status_code = 400
return response
次に、ビュー関数から次のエラーを返すことができます。
@app.route('/')
def index():
if error_condition:
return bad_request('message that appears in body')
応答を返すことができない場所で、コールスタックのより深い場所でエラーが発生した場合は、カスタム例外を使用できます。例えば:
class BadRequestError(ValueError):
pass
@app.errorhandler(BadRequestError)
def bad_request_handler(error):
return bad_request(str(error))
次に、エラーを発行する必要がある関数で、例外を発生させます。
def some_function():
if error_condition:
raise BadRequestError('message that appears in the body')
これがお役に立てば幸いです。
私は単にこのようにします:
abort(400, description="Required parameter is missing")
flask.abortは、flask.Responseも受け入れます。
abort(make_response(jsonify(message="Error message"), 400))