1

POSTメッセージ本文としてネストされた配列を受け取り、値のリストを返すフラスコを使用してAPIを作成しています。例はcurl …. –d ”(([[1, [], [2, 3]], [[4]], 5])” は [1,2,3,4,5] を返します。平坦化スクリプトはコマンドで機能しますしかし、API に POST すると、奇妙な結果が得られます。コードは次のとおりです。

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 でキーと値のペアではなく、値だけを返すことは可能ですか? {"response": [1,2,3,4,5]} ではなく [1,2,3,4,5] だけを返したい

4

1 に答える 1

1

Flask からデシリアライズされたデータを使用する必要があります。request.data使用する代わりにrequest.json

コードを次のように変更します。

return jsonify({"response" : flatten(request.json)})
于 2013-05-21T19:03:05.663 に答える