json Flask API忽略elif和else语句

wn9m85ua  于 2023-02-06  发布在  其他
关注(0)|答案(1)|浏览(135)

我正在写一个flask API,它可以接收不同类型的嵌套json文件。我想根据来自这些文件的不同信息做一些事情。
我根据if语句对文件进行排序,这是简化版本:

if (jsonFile['data']['shape'] == "cube"):
    function(jsonFile)
elif (jsonFile['data']['shape'] == "cone"):
    function(jsonFile)
elif (jsonFile['data']['sphere']):
    function(jsonFile)
else:
    print("Unknown file")

当我通过postman发送一个嵌套的json文件时,例如一个包含sphere的文件,我得到了一个500 error "KeyError: shape",并且我从来没有到达elif语句。
如果我把包含sphere的elif语句和顶部的一个交换,那么只有sphere有效,其余的都无效。它只对顶部的if语句有效,如果条件不满足,它会抛出一个错误并忽略块的其余部分。即使我发送随机的东西,我也永远不会到达else语句。
其余语句都可以独立工作。
包含多维数据集的json文件示例:

{
    "data": {
        "shape": "cube"
    }
}

包含sphere的json文件示例:

{
    "data": {
        "sphere": {
            "description": "spherical"
        }
    }
}

这是完整的错误:

ERROR in app: Exception on /processshape [POST]
Traceback (most recent call last):
  File "C:\Users\user1\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 2525, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\user1\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 1822, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\user1\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 1796, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
  File "d:\python\shape-api\app.py", line 34, in processshape
    if (resp['data']['shape'] == "cube"):
KeyError: 'shape'
127.0.0.1 - - [02/Feb/2023 00:03:38] "POST /processshape HTTP/1.1" 500 -
ujv3wf0j

ujv3wf0j1#

问题在于if (jsonFile['data']['shape'] == "cube")已执行。这将执行表达式jsonFile['data']['shape']jsonFile['data']将计算为dict。但是,此dict不包含键shape。因此,将引发KeyError,并且不会执行elif。
你可以通过改变

if (jsonFile['data']['shape'] == "cube")

if ('shape' in jsonFile['data'] and jsonFile['data']['shape'] == "cube")

这样,如果键shape的值不存在,您就不会尝试访问它。
同样的修改也必须应用到其他情况中。如果不能确定键data是否总是包含在jsonFile中,您也必须检查它。

相关问题