中返回的异常会破坏我的JSON客户端。我想对此输出进行 json化。
更多细节:我有一个视图函数,它是这个 api 应用程序的端点。
如您所见,此函数以 json 格式返回结果。
@app.route('/route1')
def api_route1():
if user_id in request.args:
k1 = request.args['user_id']
return flask.jsonify(recs=some_function(k1))
else:
return "no valid user_id supplied"
问题,未处理的异常在 HTML 中,例如,
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01
Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>TypeError: 'NoneType' object is not iterable // Werkzeug Debugger</title>
<link rel="stylesheet"
href="?__debugger__=yes&cmd=resource&f=style.css"
type="text/css">
这会破坏我的 json 客户端。HTML 格式显然是默认格式,但我不知道如何选择退出并指定 jsonized 异常(理想情况下,jsonify 返回的任何内容甚至标头)。
我怀疑我需要的东西在优秀的 Flask 文档中的某个地方,但我找不到它。
您应该在烧瓶中定义 HTTP 错误处理程序。
一个简单的 JSON reing 404 处理程序可能如下所示:
@app.errorhandler(404)
def page_not_found(e):
return flask.jsonify(error=404, text=str(e)), 404
这样,您将能够检查客户端上的data.error
,如果存在,则可以使用 data.text 获取错误文本(作为 e
传递的错误werkzeug.exceptions.NotFound
其字符串表示形式为"404:未找到")。
使回溯可用于 JSON 客户端可能会泄露敏感信息。
我的建议是:
- 关闭调试
- 安装日志聚合工具,如哨兵
- 使此应用程序的错误 500 页返回 JSON 格式的一般错误
500 页面可能如下所示:
{ "error": "500 - internal server error" }
代码应该可以解决问题。因此,我们的想法是捕获可能引发的任何异常,使用回溯模块获取格式化为字符串的异常详细信息,然后将其作为有效的 json 返回。我建议放置一堆 except 语句,其中包含您期望发生的主要错误类型和更具可读性的错误消息。然后你可以有一个最后一个,除非作为一个捕获,以防万一发生奇怪和意外的事情。
import traceback
@app.route('/route1')
def api_route1():
if user_id in request.args:
try:
k1 = request.args['user_id']
return flask.jsonify(recs=some_function(k1))
except:
return flask.jsonify(exception=traceback.format_exc())
else:
return flask.jsonify(exception="no valid user_id supplied")