【问题标题】:Flattening an array in Flask API在 Flask API 中展平数组
【发布时间】:2013-05-16 15:32:02
【问题描述】:

我正在使用烧瓶制作一个 API,该 API 将 POST 消息正文作为嵌套数组,然后返回值列表。一个例子是 curl ...。 -d ”(([[1, [], [2, 3]], [[4]], 5])” 将返回 [1,2,3,4,5]。展平脚本在命令中起作用行,但是当我 POST 到 API 时,我得到了一些奇怪的结果。代码在这里:

app = Flask(__name__)
app.config.from_object(__name__)
app.config.from_envvar('PHIGITAL_SETTINGS', silent=True)


@lru_cache(maxsize=500)
def flatten(l):
    flattened = []
    for el in l:
        if isinstance(el, (list, tuple)):
            flattened.extend(flatten(el))
        else:
            flattened.append(el)
    return flattened

@app.route('/flatten', methods=['POST'])
def flatten_api():
    if request.method == 'POST':
        try:
            return jsonify({"response" : flatten(request.data)})
        except Exception as e:
            return jsonify({"response" : "ERROR: %s" % str(e)})

if __name__ == '__main__':
    app.run()

在 Postman 中对此进行测试得到了响应:{ "response": [ "[", "[", "1", ",", " ", "[", "]", ",", " "、"["、"2"、","、""、"3"、"]"、"]"、"、""、"["、"["、"4"、"] ", "]", ",", " ", "5", "]" ] }

这显然是不正确的。我认为这可能与 request.data 是一个字符串这一事实有关,所以我尝试使用 ast.literal_eval 使 request.data 成为一个列表,但是当我收到错误“unhashable type: 'list'”尝试在 ast.literal_eval(request.data) 上调用 flatten。我完全被难住了,任何帮助将不胜感激。

另外,在 Flask 中是否可以只返回一个值,而不是一个键值对?我宁愿只返回 [1,2,3,4,5] 而不是 {"response": [1,2,3,4,5]}

【问题讨论】:

  • 出于安全原因,jsonify 不支持顶级数组。只是出于好奇,您为什么需要一个 API 端点?

标签: python api post flask


【解决方案1】:

您需要使用来自 Flask 的反序列化数据。而不是request.data 使用request.json

将您的代码更改为:

return jsonify({"response" : flatten(request.json)})

【讨论】:

  • 那么您很可能忘记了 curl 命令的 -H Content-Type:application/json 选项。 Flask 使用 content-type 来确定如何处理输入
  • 我这样测试了你的代码:curl -d '[1,222,[222,33321]]' -H Content-Type:application/json http://localhost:5000/flatten
猜你喜欢
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 2016-08-10
  • 2015-05-17
  • 2021-12-27
  • 2021-10-16
  • 2016-07-30
  • 2014-05-21
相关资源
最近更新 更多