0

リソースに put ハンドラーを実装しようとしています。コードは次のとおりです。

class Settings(restful.Resource):
    def put(self):
        settings = request.form['settings']
        print settings

ここにデータを配置する方法は次のとおりです。

import requests
url='http://localhost:8000/settings'
data = {'settings': {
            'record': {
                'b': 'ok',
                'c': 20,
                'd': 60,
            },
            'b': {
                'c': {
                    'd': 3,
                    'e': 2,
                    'f': 2,
                },
                'd': 5,
                'a': 'voice',
                'k': {
                    'l': 11.0,
                    'm': 23.0,
                },
            }
        }
}
requests.put(url, data)

そしてrecord、それを行うとコンソールにのみ出力されるため、検証を行うと、データが辞書ではないため失敗します。何が悪いのかわかりません。

Flask-RESTful Quickstartのコードと同じように見えますが、うまくいけばrequests辞書で動作します。

4

1 に答える 1

2

data引数として辞書を渡すとrequests、ブラウザのフォームと同じように、データを ``application/x-www-form-urlencoded` にエンコードします。このエンコード形式は、(順序付けられた、一意ではない) キーと値のシーケンスを超える構造化データをサポートしていません。

application/x-www-form-urlencoded構造化データの投稿には使用しないでください。代わりに JSON を使用します。

import json

# ...

requests.put(url, json.dumps(data), headers={'Content-Type': 'application/json'})

次に、Flaskrequest.get_json()でペイロードを再度ロードします。

class Settings(restful.Resource):
    def put(self):
        settings = request.get_json()['settings']
        print settings

requestsバージョン 2.4.2 以降を使用している場合は、JSON エンコーディングをrequestsライブラリに任せることもできます。dataオブジェクトをjsonキーワード引数として渡すだけです。正しい Content-Type ヘッダーも設定されます。

requests.put(url, json=data)

その後、自分自身を呼び出す必要がないことに注意してjson.dumps()ください。

于 2014-07-08T14:28:39.413 に答える