【发布时间】: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 端点?