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

Yukarıdaki parametreler isteklerle gönderildiğinde, Flask'ta request.form kullanarak adres anahtarında nasıl değer alabilirim?İç içe geçmiş sözlüğün değerini Flask'ta ImmutableMultiDict kullanarak nasıl alabilirim?

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

Daha sonra bunu flask.request bağlamında aldım.

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

Her adres anahtarındaki değeri nasıl alabilirim?

Teşekkürler.

böyle örneğin

cevap

16

:

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

baskılar:

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

düzenleme:

Kişisel SONRASI isteğinizde anahtar/değer olarak kombinasyon olarak, yani application/x-www-form-urlencoded gönderilir

çiftleri. Doğrudan iç içe geçmiş bir dict yapısını desteklemez. Kıvrılma isteğinizi denediğimde, şu anlama gelir: Buradaki anahtarlar burada tam anlamıyla anlamlandırılır.

ve kullanma urllib2 ben bu sonucu elde:

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

urlencode basitçe iç dict dize temsilini gönderir. requests kullanarak

ve son olarak:

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

dizi düzleştirilmiş ve yinelenen anahtarlar elimine edilir.

Sizinki gibi iç içe geçmiş bir dict'ın nasıl kodlanmış bir şekilde gönderileceğinin tanımlanmış bir yolu yoktur, bu yüzden başka bir çözüm bulmanız gerekir.

Bu örnek verdi
+0

Yukarıdaki örnekte 'San Francisco' almanın bir yolu var mı? Ebeveyn dict'taki dict değerini kastediyorum. – kinakomochi

+0

Bu bilgi taslakta görünmüyor ...Bunun gibi bir dict gönderebileceğinden emin değilim ... kontrol etmeliyim ... Postalama talebinizi nasıl gönderiyorsunuz? – mata

+0

Yayın talebini curl ile gönderiyorum. Açıklama eksikliği için özür dilerim. Adres dict'ten değerler (San Francisco, New York, Londra) almak istiyorum. – kinakomochi

1

: Böyle bir istek ile

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

, request.form şu şekilde görünecektir:

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

[ ve ] karakterlerin özel değildir, onlar anahtarların sadece bir parçasıdır . As documented, bir MultiDict her bir anahtarı yalnızca bir değere değil, bir değerler listesine de eşler. [] Ile normal dictionnary access sadece ilk anahtarı verir, ancak getlist() yöntemi tek bir liste için tüm listeyi verir. Diğer yöntemler kullanılabilir, dokümanlar bakın.

Yuvalanmış bir yapıyı gerçekten istiyorsanız, düz form verileri yerine JSON'u deneyin.

İlgili konular