2012-05-21 5 views
13
address_dict = {'address': {'US': 'San Francisco', 'US': 'New York', 'UK': 'London'}} 

Kiedy powyższe parametry zostały wysłane za pomocą zapytań, w jaki sposób mogę uzyskać wartości w kluczu adresu za pomocą request.form w Flask?Jak mogę uzyskać wartość zagnieżdżonego słownika za pomocą ImmutableMultiDict na kolbie?

import requests 
url = 'http://example.com' 
params = {"address": {"US": "San Francisco", "UK": "London", "CH": "Shanghai"}} 
requests.post(url, data=params) 

Następnie mam to w kontekście flask.request.

ImmutableMultiDict([('address', u'US'), ('address', 'US'), ('address', 'UK')]) 

Jak mogę uzyskać wartość w każdym kluczu adresu?

Dzięki.

Odpowiedz

16

na przykład tak:

from werkzeug.datastructures import ImmutableMultiDict 
imd = ImmutableMultiDict([('address', u'US'), ('address', 'US'), ('address', 'UK')]) 
print imd.getlist('address') 

drukuje:

[u'US', 'US', 'UK'] 

edit:

Twój post-prośba zostanie wysłana application/x-www-form-urlencoded, co oznacza, jak kombinacji jako klucz/wartość pary. Nie obsługuje bezpośrednio zagnieżdżonej struktury dyktowanej. Kiedy próbuję twojego curl-żądania, dostaję to:

ImmutableMultiDict([('address[US]', u'San Francisco'), ('address[US]', u'New York'), ('address[UK]', u'London')]) 

, więc klucze są tu interpretowane dosłownie.

i korzystania urllib2 ja dostać ten wynik:

>>> print urllib2.urlopen("http://localhost:5000/post", data=urllib.urlencode(address_dict)).read() 
ImmutableMultiDict([('address', u"{'UK': 'London', 'US': 'New York'}")]) 

tutaj urlencode prostu wysyła ciąg znaków reprezentujący wewnętrznej dict.

i wreszcie za pomocą requests:

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

tutaj tablica jest spłaszczona i klucze powtarzające wyeliminowane.

Po prostu nie ma zdefiniowanego sposobu wysyłania zagnieżdżonego dyktatury, takiego jak twój, w sposób uproszczony, więc będziesz musiał znaleźć inne rozwiązanie.

+0

Czy istnieje sposób na uzyskanie "San Francisco" w powyższym przykładzie? Mam na myśli wartość dyktatu w dyktowaniu rodziców. – kinakomochi

+0

Te informacje nie wydają się być w dyktacie ...Nie jestem pewien, czy możesz wysłać taki dyktat ... musisz to sprawdzić ... Jak wysłać prośbę o wpis? – mata

+0

Wysyłam wiadomość pocztową za pośrednictwem curl. Przepraszam za brak wyjaśnienia. Chciałbym uzyskać wartości (San Francisco, Nowy Jork, Londyn) od adresu Dict. – kinakomochi

1

Dałeś poniższym przykładzie:

curl http://example.com -d "address[US]=San Francisco" -d "address[US]=New York" -d address[UK]=London" 

Z takiego wniosku, request.form będzie wyglądać następująco:

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

W [ i ] znaki nie są specjalne, są one tylko część klawiszy . As documented, MultiDict zamapuje każdy klucz nie tylko na jedną wartość, ale na listę wartości. Normalny dostęp do słownika z [] daje tylko pierwszy klucz, ale metoda getlist() daje całą listę dla jednego klucza. Dostępne są inne metody, zobacz dokumentację.

Jeśli naprawdę chcesz zagnieżdżoną strukturę, spróbuj JSON zamiast płaskich danych formularzy.

Powiązane problemy