如何在使用自定义错误处理程序时从abort命令访问错误消息

时间:2014-01-22 21:59:36

标签: python http flask http-error

使用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变量是一个空字符串。我似乎无法找到有关如何使用自定义错误处理程序访问中止函数的第二个变量的文档

4 个答案:

答案 0 :(得分:64)

如果查看flask/__init__.py,您会看到abort实际上是从werkzeug.exceptions导入的。查看Aborter class,我们可以看到,当使用数字代码调用时,将查找特定的HTTPException子类,并使用提供给Aborter实例的所有参数进行调用。查看HTTPException,特别注意lines 85-89,我们可以看到传递给HTTPException.__init__的第二个参数存储在description属性中,正如@dirn指出的那样。

您可以从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')

答案 1 :(得分:57)

人们过分依赖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(error.message)

然后在需要发出错误的函数中,您只需引发异常:

def some_function():
    if error_condition:
        raise BadRequestError('message that appears in the body')

我希望这会有所帮助。

答案 2 :(得分:17)

我只是这样做:

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

答案 3 :(得分:2)

flask.abort也接受flask.Response

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