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

當通過請求發送上述參數時,如何使用Flask上的request.form在地址鍵中獲取值?如何在Flask上使用ImmutableMultiDict獲取嵌套字典的值?

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

如何獲取每個地址鍵的值?

謝謝。

回答

16

例如是這樣的:

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,這意味着作爲組合的鍵/值對。它不直接支持嵌套的字典結構。當我嘗試你的捲曲請求我得到這個:

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的方式發送像你的嵌套字典,所以你必須找到另一種解決方案。

+0

在上面的例子中,有沒有辦法得到'舊金山'?我的意思是在父代字典中的字典值。 – kinakomochi

+0

這個信息似乎沒有在字典中...我不確定你可以發送這樣的字典......必須檢查它......你如何發送郵寄請求? – mata

+0

我通過curl發送帖子請求。對不起,沒有解釋。我想從地址字典中獲得價值觀(舊金山,紐約,倫敦)。 – kinakomochi

1

你給了這個例子:

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而不是平面表單數據。

相關問題