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')])
如何获取每个地址键的值?
感谢。
答案 0 :(得分: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结构。当我尝试你的卷曲请求时,我得到了这个:
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')])
此处阵列被展平并且重复出现了键。
如果以urlencoded方式发送像你这样的嵌套dict,根本没有定义的方法,所以你必须找到另一个解决方案。
答案 1 :(得分: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']
[
和]
字符并不特殊,它们只是键的一部分。 As documented,MultiDict不仅会将每个键映射到一个值,还会映射到值列表。使用[]的正常字典访问只会给你第一个键,但getlist()方法会给出一个键的整个列表。其他方法可用,请参阅文档。
如果您真的想要嵌套结构,请尝试使用JSON而不是平面数据。