16
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')])

アドレスの各キーの値を取得するにはどうすればよいですか?

ありがとう。

4

2 に答える 2

18

たとえば、次のようにします。

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 構造を直接サポートしていません。curl-request を試すと、次のようになります。

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では、内部辞書の文字列表現を送信するだけです。

そして最後に使用requests

>>> print requests.post("http://localhost:5000/post", data=address_dict).content
ImmutableMultiDict([('address', u'UK'), ('address', u'US')])

ここでは、配列がフラット化され、繰り返しキーが削除されます。

あなたのようなネストされた dict を urlencode された方法で送信する方法は定義されていないため、別の解決策を見つける必要があります。

于 2012-05-21T09:58:22.067 に答える
2

あなたはこの例を挙げました:

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 を試してください。

于 2012-07-27T19:22:37.433 に答える