我正在为我正在处理的应用编写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模型验证器和在写入数据库时的唯一约束问题,并且在以下两种情况下都会向客户端发送以下错误: / p>
{
"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
}
答案 0 :(得分:8)
您可以直接在abort()函数中添加自定义响应:
abort(make_response("Integrity Error", 400))
或者,您可以将它放在错误处理函数
中@app.errorhandler(400)
def not_found(error):
resp = make_response("Integrity Error", 400)
return resp
答案 1 :(得分:7)
errorhandler
也可以采用异常类型:
@app.errorhandler(AssertionError)
def handle_sqlalchemy_assertion_error(err):
return make_response(standard_response(None, 400, err.message), 400)
答案 2 :(得分: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
默认或自定义消息