【问题标题】:Get JSON from Flask request only if it is valid仅在有效时从 Flask 请求中获取 JSON
【发布时间】:2019-11-03 17:54:20
【问题描述】:

我知道有很好的模块(比如validator-collection)可以检查 JSON 是否有效。但就我而言,我想通过内置的 Flask 功能来实现这一点:is_json()get_json()

这是我尝试过的:

import flask

def get_json_data():
    if flask.request.is_json():
        try:
           data = flask.request.get_json()
        except(ValueError):
            # get_json failed, return None
            # handle ValueError
    else:
        # is_json failed, return None
        # handle ValueError

阅读文档后,我只能发现引发了 ValueError 异常。如果这确实是唯一的例外,那么我的上述方法是否正确处理它并确保 data 仅在发出有效的 JSON 请求时才保存 JSON 数据?

【问题讨论】:

    标签: json python-3.x flask


    【解决方案1】:

    The documentation 声明 .is_json() 仅检查请求是否具有表明请求包含 JSON 数据的 Content-Type

    属性 is_json
    检查 mimetype 是否指示 JSON 数据,application/jsonapplication/+json*。

    检查请求数据是否真的是JSON,所以这个检查的用处是有限的。当客户端发送 JSON 但未设置适当的 Content-Type 标头,或设置标头但发送无效 JSON 时,您从 .is_json() 中一无所获。


    但是,.get_json()进行“包含有效 JSON”检查:它尝试将请求数据解析为 JSON,并且要么有效,在这种情况下它返回数据,要么失败,在这种情况下会引发错误。默认情况下,.get_json() 无论如何都会在内部调用.is_json()

    对于你想做的事情,我会说这已经足够了。

    def get_json_data():
        data = flask.request.get_json()
    

    如果解析不成功,则不会抛出错误(比较werkzeug docs)。而是将“错误请求”返回给客户端。如果您想更改该行为,请使用您自己的版本覆盖 Request.on_json_loading_failed() 方法。

    【讨论】:

    • 感谢您的回答。只是为了教育我的理解:如果get_json() 失败,ValueError 是唯一可能引发的异常吗?如果get_json 因非值错误原因而失败,我是否应该处理更一般的异常?
    • 其实...我不确定。查看源代码应该可以解决问题。
    • 这里是 werkzeug GitHub 存储库中.get_json() 定义的链接(烧瓶正在使用)github.com/pallets/werkzeug/blob/…。内联文档相当不错。
    • 事实证明根本没有抛出任何错误 - 它是如何为您引发 ValueError 的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    • 2013-01-09
    相关资源
    最近更新 更多