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

dou*_*oug 11 html python api json 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))
    else:
        return "no valid user_id supplied"
Run Code Online (Sandbox Code Playgroud)

问题,未处理的异常是在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">
Run Code Online (Sandbox Code Playgroud)

这打破了我的json客户端.HTML格式显然是默认的,但我不知道如何选择退出它并指定jsonified异常(理想情况下jsonify返回甚至标题的任何东西).

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

com*_*xer 13

您应该在flask中定义HTTP 错误处理程序.

一个简单的JSON returing 404处理程序可能如下所示:

@app.errorhandler(404)
def page_not_found(e):
    return flask.jsonify(error=404, text=str(e)), 404
Run Code Online (Sandbox Code Playgroud)

有了这个,你就可以检查data.error在客户端上,如果它存在,你可以得到data.text错误文本(通过误差ewerkzeug.exceptions.NotFound其字符串表示是"404:未找到").

  • 这是否意味着我需要为每个不成功的 http 状态代码(5xx 和 4xx)创建一个错误处理程序?一定会有更好的办法。 (2认同)

Pau*_*ine 7

使JSON客户端可以使用回溯可能会泄露敏感信息.

我的建议是:

  • 关闭调试
  • 安装像哨兵这样的日志聚合工具
  • 使此应用程序的错误500页返回json格式的一般错误

500页可能看起来像:

{ "error": "500 - internal server error" }
Run Code Online (Sandbox Code Playgroud)