Подтвердить что ты не робот

Как я могу получить значение вложенного словаря, используя ImmutableMultiDict в Flask?

address_dict = {'address': {'US': 'San Francisco', 'US': 'New York', 'UK': 'London'}}

Когда вышеприведенные параметры были отправлены через запросы, как я могу получить значения в ключе адреса с помощью request.form на Flask?

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

Как я могу получить значение в каждом ключе адресов?

Спасибо.

4b9b3361

Ответ 1

например, например:

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-запрос, я получаю следующее:

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 способом, так что вам придется найти другое решение.

Ответ 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 будет отображать каждый ключ не только на одно значение, но и на список значений. Обычный доступ к dictionnary с помощью [] даст вам только первый ключ, но метод getlist() дает полный список для одного ключа. Другие методы доступны, см. Документы.

Если вы действительно хотите вложенную структуру, попробуйте JSON вместо данных с плоской формой.