我在我的应用程序中使用以下错误处理程序:
def make_json_error(ex):
status_code = ex.code if isinstance(ex, HTTPException) else 500
description = str(ex.description) if isinstance(ex, HTTPException) else 'internal server error'
message = {'error': {'message': '{}: {}'.format(str(status_code), description)}}
response = jsonify(message)
response.status_code = status_code
return response
然后在创建Flask应用程序时使用:
for code in werkzeug.exceptions.default_exceptions:
app.errorhandler(code)(make_json_error)
奇怪的是,它不会为某些无效请求返回JSON格式的错误:
$ curl 'http://127.0.0.1:5000/api/tickets?id=a' -H "Content-Type: application/json"
{
"error": {
"message": "400: Invalid id parameter values"
}
}
$ curl 'http://127.0.0.1:5000/api/tickets?id=a 1' -H "Content-Type: application/json"
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<title>Error response</title>
</head>
<body>
<h1>Error response</h1>
<p>Error code: 400</p>
<p>Message: Bad request syntax ('GET /api/tickets?id=a 1 HTTP/1.1').</p>
<p>Error code explanation: 400 - Bad request syntax or unsupported method.</p>
</body>
</html>
请注意第二个命令中查询字符串中的额外空格。任何想法为什么这也不作为常规400错误处理,与第一个相同?据我所知,第二个URL甚至没有通过/tickets
视图函数进行路由,因此我假设空格在Flask中以某种方式特别解释。