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

जब उपरोक्त पैरामीटर अनुरोध के माध्यम से भेजे गए थे, तो फ्लास्क पर request.form का उपयोग करके पता कुंजी में मूल्य कैसे प्राप्त कर सकते हैं?फ्लास्क पर 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'] 

संपादित करें:

आपका बाद अनुरोध भेज दिया जाता है 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 बस भीतरी dict के एक स्ट्रिंग प्रतिनिधित्व भेजता है।

और अंत में requests का उपयोग कर:

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

सरणी चपटा है और बार-बार कुंजी सफाया कर दिया।

कोई परिभाषित तरीका नहीं है कि आपके जैसे घोंसले वाले निर्देश को यूआरएलएनकोडेड तरीके से कैसे भेजा जाए, इसलिए आपको एक और समाधान मिलना होगा।

+0

क्या उपरोक्त उदाहरण में 'सैन फ्रांसिस्को' पाने का कोई तरीका है? मेरा मतलब माता-पिता के निर्देश में तानाशाही का मूल्य है। – kinakomochi

+0

वह जानकारी dict में प्रतीत नहीं होती है ...मुझे यकीन नहीं है कि आप इस तरह एक निर्देश भेज सकते हैं ... इसे जांचना है ... आप पोस्ट अनुरोध कैसे भेजते हैं? – mata

+0

मैं कर्ल के माध्यम से पोस्ट अनुरोध भेजता हूं। स्पष्टीकरण की कमी के लिए खेद है। मैं पता dict से मूल्य (सैन फ्रांसिस्को, न्यूयॉर्क, लंदन) प्राप्त करना चाहता हूं। – 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, एक मल्टीडिक्ट प्रत्येक कुंजी को केवल एक मान पर ही नहीं बल्कि मूल्यों की सूची में मैप करेगा। [] के साथ सामान्य डिक्शनरी पहुंच केवल आपको पहली कुंजी देगी, लेकिन getlist() विधि एक कुंजी के लिए पूरी सूची देता है। अन्य विधियां उपलब्ध हैं, दस्तावेज़ देखें।

यदि आप वास्तव में एक नेस्टेड संरचना चाहते हैं, तो फ्लैट फ़ॉर्म डेटा के बजाय JSON आज़माएं।

संबंधित मुद्दे

 संबंधित मुद्दे