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

在这里,数组被展平并消除了重复键。

根本没有定义的方式如何以 urlencoded 方式发送像您这样的嵌套字典,因此您必须找到另一个解决方案。

于 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 将每个键不仅映射到一个值,而且映射到一个值列表。使用 [] 的普通字典访问只会给你第一个键,但 getlist() 方法会给出一个键的整个列表。其他方法可用,请参阅文档。

如果您真的想要一个嵌套结构,请尝试使用 JSON 而不是平面表单数据。

于 2012-07-27T19:22:37.433 回答