web-dev-qa-db-ja.com

カスタムエラーハンドラーを使用する場合、中止コマンドからエラーメッセージにアクセスする方法

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番目の変数にアクセスする方法についてのドキュメントを見つけることができないようです。

44
richmb

flask/__init__.py を見ると、abortwerkzeug.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')
67
Sean Vieira

人々は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')

これがお役に立てば幸いです。

57
Miguel

私は単にこのようにします:

    abort(400, description="Required parameter is missing")
20
Vasili Pascal

flask.abortは、flask.Responseも受け入れます。

abort(make_response(jsonify(message="Error message"), 400))
3
Neil