2012-05-21 2 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'] 

편집 :

이 후반 요청 키/값으로 조합 의미 application/x-www-form-urlencoded 송신된다

한 쌍. 중첩 된 dict 구조를 직접 지원하지 않습니다. 귀하의 컬 요청을 시도하면 다음과 같이 표시됩니다.

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 방식으로 보내는 방법은 정의 된 방법이 없으므로 다른 해결책을 찾아야합니다.

당신이 예를 준
+0

위의 예에서 '샌프란시스코'를 만날 수있는 방법이 있습니까? 나는 부모 dict에있는 dict의 가치를 의미한다. – 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, MultiDict는 각 키를 하나의 값뿐만 아니라 값 목록에 매핑합니다. []를 사용하는 일반적인 사전 액세스는 첫 번째 키만 제공하지만 getlist() 메서드는 하나의 키에 대한 전체 목록을 제공합니다. 다른 방법도 사용할 수 있습니다. 문서를 참조하십시오.

중첩 된 구조가 실제로 필요한 경우 플랫 폼 데이터 대신 JSON을 사용해보십시오.