15

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">

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

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

4

3 回答 3

20

您应该在烧瓶中定义 HTTP错误处理程序。

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

@app.errorhandler(404)
def page_not_found(e):
    return flask.jsonify(error=404, text=str(e)), 404

有了这个,您将能够data.error在客户端上进行检查,如果存在,您可以使用 data.text 获取错误文本(传递的错误ewerkzeug.exceptions.NotFound其字符串表示形式为“404:未找到”)。

于 2012-12-10T00:12:49.823 回答
7

向 JSON 客户端提供回溯可能会泄露敏感信息。

我的建议是:

500 页可能如下所示:

{ "error": "500 - internal server error" }
于 2012-12-08T04:25:16.657 回答
2

下面的代码应该可以解决问题。所以想法是捕获任何可能引发的异常,使用 traceback 模块将异常详细信息格式化为字符串,然后将其作为有效的 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")
于 2012-12-08T04:44:17.810 回答