Python Flask中的API——返回JSON,但HTML异常会破坏我的JSON客户端

Python Flask中的API——返回JSON,但HTML异常会破坏我的JSON客户端,python,html,json,api,flask,Python,Html,Json,Api,Flask,HTML中返回的异常会破坏我的JSON客户端。我想对这个输出进行jsonify 更多细节:我有一个视图函数,它是这个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)

HTML中返回的异常会破坏我的JSON客户端。我想对这个输出进行jsonify

更多细节:我有一个视图函数,它是这个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&amp;cmd=resource&amp;f=style.css" 
            type="text/css">

TypeError:“非类型”对象不可编辑//Werkzeug调试器
这破坏了我的json客户端。HTML格式显然是默认格式,但我不知道如何选择退出并指定jsonified异常(理想情况下是jsonified任何返回的内容,甚至是头)


我怀疑我需要的是优秀的Flask文档中的某个地方,但我找不到它。

将回溯提供给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")
您应该定义HTTP

简单的JSON返回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发送,以防出现问题?@Blender,是的,这就是我想要的。这是OP应该做的。即使是其他部分也可以使用jsonify,当用户id不在参数中时,这将再次返回html。@Codeanu很好的建议,我用你的建议更新了答案。