使用Flask-Restful引发自定义错误

13

大家好,我正在尝试使用Flask-Restful提供的自定义错误功能抛出异常,文档地址为:the docs。出于测试目的,我已经按照文档中定义并注册了错误字典:api = flask_restful.Api(app, errors=errors)

但是,当我在资源模块中使用(例如)abort(409)抛出自定义异常时,Firebug报告如下:

{ "message": "Conflict", "status": 409 }

这似乎是标准的409错误,没有任何自定义内容;根据文档,我期望看到的是自定义错误消息——“用户名已存在。”

我认为我遗漏了关于抛出异常本身的某些内容。我是否需要以某种方式使用字典键?查看Flask-Restful源代码并没有帮助我解决问题,尽管我已经尝试过。


2
我也有同样的问题。如果我为400定义了3个不同的错误,那么如何引发这些错误呢?文档中说它将try和catch保存在api函数中,但我没有看到清晰的方法可以实现。 - esdotzed
1个回答

20
要在Flask-RESTful中为标准HTTP状态码定义消息,您必须重新定义Werkzeug提供的HTTP异常之一,因为Flask基于它。以下是一个示例,用于覆盖Conflict exception
errors = {
    'Conflict': {
        'message': "A user with that username already exists.",
        'status': 409,
    },
}

app = Flask(__name__)
api = flask_restful.Api(app, errors=errors)

因此,每次您调用abort(409)时,这都将返回正确媒体类型的表示,并带有定义的消息。
然而,通过使用此方法,在任何地方中您中止具有409状态代码时,这都将返回有关已存在用户名的用户的消息。当您在处理与用户不同的其他资源的视图中调用abort(409)时,这可能不是您想要的。
因此,我建议您只需使用Flask-RESTfulabort方法,每当您想提供自定义消息时,请按如下方式执行:
from flask.ext.restful import abort

abort(409, description="A user with that username already exists.")

通常来说,通过定义自定义错误消息扩展Flask-RESTful在您引发自定义异常(使用raise()而不是Werkzeug提供的HTTP异常中的abort())时非常有用。请注意保留HTML标记。

1
我在上述问题上遇到了很多麻烦:*** TypeError: abort()需要恰好1个参数(但提供了2个)。 - Kelvin
1
@Kelvin 请确保你从 flask 中导入 abort,而不是从 flask_restful 中导入。这就是我收到此错误的原因。 - herrherr
@Kelvin 尝试使用 abort(409, message="该用户名已经存在")。 - Handsome Greg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接