10

我目前正在为我正在开发的应用程序编写 REST API。该应用程序是使用烧瓶在 python 中编写的。我有以下内容:

try:
    _profile = profile(
        name=request.json['name'],
        password=profile.get_salted_password('blablabla'),
        email=request.json['email'],
        created_by=1,
        last_updated_by=1
    )
except AssertionError:
    abort(400)

session = DatabaseEngine.getSession()
session.add(_profile)
try:
    session.commit()
except IntegrityError:
    abort(400)

错误处理程序如下所示:

@app.errorhandler(400)
def not_found(error):
    return make_response(standard_response(None, 400, 'Bad request'), 400)

我使用错误 400 来表示 sqlalchemy 模型验证器的问题写入数据库时​​的唯一约束,并且在这两种情况下,都会向客户端发送以下错误:

{
  "data": null,
  "error": {
    "msg": "Bad request",
    "no": 400
  },
  "success": false
}

有没有办法仍然使用 abort(400) 但也以某种方式设置错误,以便错误处理程序可以负责在结果中为错误对象添加附加信息?

我希望它更符合:

{
  "data": null,
  "error": {
    "msg": "(IntegrityError) duplicate key value violates unique constraint profile_email_key",
    "no": 400
  },
  "success": false
}
4

3 回答 3

8

您可以直接在 abort() 函数中放置自定义响应:

abort(make_response("Integrity Error", 400))

或者,您可以将其放在错误处理函数中

@app.errorhandler(400)
def not_found(error):
resp = make_response("Integrity Error", 400)
return resp
于 2013-08-06T14:05:24.140 回答
7

errorhandler也可以采用异常类型:

@app.errorhandler(AssertionError)
def handle_sqlalchemy_assertion_error(err):
    return make_response(standard_response(None, 400, err.message), 400)
于 2013-08-06T16:37:24.920 回答
0

我知道比赛迟到了,但对于任何想要另一种解决方案的人来说,我的答案是基于@codegeek 的答案。

我能够在我的ServerResponse.py模块中完成与以下类似的事情:

def duplicate(message=""):
    response = make_response()
    response.status_code = 409
    response.headers = {
        "X-Status-Reason" : message or "Duplicate entry"
    }
    abort(response)

然后我可以打电话

ServerResponse.duplicate('Duplicate submission. An article with a similar title already exists.')

这使我的 AngularJS 应用程序可以轻松检查响应状态并显示X-Status-Reason默认或自定义消息

于 2014-04-08T02:43:55.017 回答