使用 Python 和 Flask 返回 API 错误消息

Posted

技术标签:

【中文标题】使用 Python 和 Flask 返回 API 错误消息【英文标题】:Returning API Error Messages with Python and Flask 【发布时间】:2012-09-19 18:15:50 【问题描述】:

我正在使用 Python 和 Flask 设计一个 RESTful API。正如预期的那样,如果一切顺利,API 需要接收 API 请求并返回数据,但在出现错误的情况下,它需要软失败并返回正确的错误。我通常会在出现错误时引发异常,但在这种情况下,我需要将错误消息返回给用户(try-catch 块?)。

我目前处理错误的方式是让我的函数同时返回数据和错误,并检查每个级别的数据,最后将数据或错误返回给 API 函数的调用者。

这样做的问题是,当有多个级别的函数调用时,它会变得很麻烦,需要我的函数多次传递数据和错误,并且每次都执行检查。

有没有更好的方法来做到这一点?我可以进行哪些改进以使错误传播更加简单和优雅?

这是我当前返回错误的方式示例:

def get_data()
    data1, error = get_some_data() # function not shown
    if data1 is None:
         return None, "could not retrieve data1"
    data2, error = get_some_other_data() # function not shown
    if data2 is None:
         return None, "could not retrieve data2"
    return (data1, data2), None

@app.route("/api/method", methods=['GET'])
def method():
    data, error = get_data()
    if data is None:
        if error is None:
            error = "unknown error"
        return json.dumps( "error": error ), 500
    return json.dumps( "data": data ), 200

【问题讨论】:

为什么不使用异常? 因为这将返回一个内部服务器错误,而没有 json 格式的正确消息。想想 Facebook API 风格。 我有点同意@thg435。在我看来,尝试...除了会稍微清理你的“方法”。您只需将错误处理块移动到“except”块,仍然可以返回错误消息。这就是我在 Django 中使用 Ajax 调用的方式。另外,我对 Flask 没有任何经验,但如果这是一个 RESTful(ish) API。这似乎是因为您要进行“GET”,您应该返回适​​当的状态代码。 200 如果一切正常。或 4XX 或 500(取决于根本问题是什么)。 我的状态码不好,我忘了在我的例子中包含它。我刚刚修好了。默认返回状态码 200。 啊,好吧,我相信我一开始误解了。我也可以试试。不确定这是否比 J.F. 的解决方案更优雅。 【参考方案1】:

您可以使用abort(http_code) 向客户端返回适当的http 代码,或者只引发非http 异常。并使用 @app.errorhandler() 装饰器为 http 错误和任意异常提供自定义处理程序。您还可以在准备好处理异常的地方使用普通的 try/except 块。 Python 不是 Go,你可以使用异常。

【讨论】:

我喜欢 raise 非 http 异常加上 @app.errorhandler() 的想法。我将在 Flask 文档中对其进行研究,然后看看它的效果如何。 +1 - errorhandlerthrowing 异常确实是正确答案 Flask 文档明确建议避免使用 abort 以支持编写自己的异常类和错误处理程序 -> flask.pocoo.org/docs/0.12/patterns/apierrors【参考方案2】:

也许Flask API 更适合您的需求,因为它专为 RESTful API 设计。

它比 Flask 有更好的异常处理,见:http://www.flaskapi.org/api-guide/exceptions/

【讨论】:

以上是关于使用 Python 和 Flask 返回 API 错误消息的主要内容,如果未能解决你的问题,请参考以下文章

Python+Flask搭建mock api server

Python | 使用Flask搭建一个API服务器

Python Flask开发简单http api接口 示例

python fastapi 返回echart

Python Flask开发简单api接口 示例

使用 Python 和 Flask 设计 RESTful API