address_dict = {'address': {'US': 'San Francisco', 'US': 'New York', 'UK': 'London'}}
上記のパラメータがリクエストを介して送信された場合、Flaskでrequest.formを使用してアドレスキーの値を取得するにはどうすればよいですか?
import requests
url = 'http://example.com'
params = {"address": {"US": "San Francisco", "UK": "London", "CH": "Shanghai"}}
requests.post(url, data=params)
次に、flask.requestのコンテキストでこれを取得しました。
ImmutableMultiDict([('address', u'US'), ('address', 'US'), ('address', 'UK')])
アドレスの各キーの値を取得するにはどうすればよいですか?
ありがとう。
たとえば、次のようになります。
from werkzeug.datastructures import ImmutableMultiDict
imd = ImmutableMultiDict([('address', u'US'), ('address', 'US'), ('address', 'UK')])
print imd.getlist('address')
プリント:
[u'US', 'US', 'UK']
編集:
POSTリクエストが送信されます application/x-www-form-urlencoded
これは、キーと値のペアとしての組み合わせを意味します。ネストされたdict構造を直接サポートしていません。私があなたのカールリクエストを試すとき、私はこれを手に入れます:
ImmutableMultiDict([('address[US]', u'San Francisco'), ('address[US]', u'New York'), ('address[UK]', u'London')])
したがって、ここではキーが文字通りに解釈されます。
urllib2
を使用すると、次の結果が得られます。
>>> print urllib2.urlopen("http://localhost:5000/post", data=urllib.urlencode(address_dict)).read()
ImmutableMultiDict([('address', u"{'UK': 'London', 'US': 'New York'}")])
ここでurlencode
は、単に内部dictの文字列表現を送信します。
そして最後にrequests
を使用します:
>>> print requests.post("http://localhost:5000/post", data=address_dict).content
ImmutableMultiDict([('address', u'UK'), ('address', u'US')])
ここでは、配列がフラット化され、繰り返しキーが削除されています。
あなたのようなネストされたdictをurlencodedの方法で送信する方法は定義されていないため、別の解決策を見つける必要があります。
あなたはこの例を挙げました:
curl http://example.com -d "address[US]=San Francisco" -d "address[US]=New York" -d address[UK]=London"
そのような要求で、request.form
は次のようになります:
>>> request.form
ImmutableMultiDict([('address[US]', u'San Francisco'), ('address[US]', u'New York'),
('address[UK]', u'London')])
>>> request.form['address[US]']
u'San Francisco'
>>> request.form.getlist('address[US]')
[u'San Francisco', u'New York']
[
および]
文字は特別なものではなく、キーの一部にすぎません。 文書化されているように 、MultiDictは、各キーを1つの値だけでなく、値のリストにマップします。 []を使用した通常の辞書アクセスでは、最初のキーのみが提供されますが、getlist()メソッドは1つのキーのリスト全体を提供します。他の方法も利用できます。ドキュメントを参照してください。
ネストされた構造が本当に必要な場合は、フラットフォームデータの代わりにJSONを試してください。