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

Cuando por encima de los parámetros se envían a través de peticiones, ¿cómo puedo obtener los valores de clave de dirección mediante request.form en el frasco?¿Cómo puedo obtener el valor del diccionario anidada utilizando ImmutableMultiDict en el frasco?

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

Luego obtuve esto en el contexto de flask.request.

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

¿Cómo puedo obtener el valor en cada tecla de dirección?

Gracias.

Respuesta

16

por ejemplo, así:

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

impresiones:

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

edición:

Su POST-solicitud se envía application/x-www-form-urlencoded, lo que significa que la combinación como clave/valor pares. No admite una estructura dict anidada directamente. Cuando pruebo su curl-request obtengo esto:

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

por lo que las claves se interpretan literalmente aquí.

y el uso de urllib2 i obtener este resultado:

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

aquí urlencode simplemente envía una representación de cadena de la dict interior.

y finalmente usando requests:

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

aquí la matriz se aplana y las teclas recurrentes eliminado.

Simplemente no hay manera definida de cómo enviar un diccionario anidada como la suya de una manera urlencoded, por lo que tendrá que encontrar otra solución.

+0

¿Hay alguna forma de obtener 'San Francisco' en el ejemplo anterior? Me refiero al valor de dict en el dict padre. – kinakomochi

+0

Esa información no parece estar en el dict ...No estoy seguro de que pueda enviar un dict como este ... tengo que verificarlo ... ¿Cómo se envía la solicitud? – mata

+0

Envío la solicitud de publicación a través de curl. Lo siento por la falta de explicación. Me gustaría obtener valores (San Francisco, Nueva York, Londres) desde el dict de la dirección. – kinakomochi

1

le dio este ejemplo:

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

Con dicha solicitud, request.form se vería así:

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

Los [ y ] caracteres no son especiales, son sólo una parte de las claves . As documented, un MultiDict se asigne cada clave no sólo para un valor, sino a una lista de valores. Acceso dictionnary normal con [] sólo le dará la primera clave, pero el método GetList() da toda la lista para una llave. Otros métodos están disponibles, vea los documentos.

Si realmente quieres una estructura anidada, tratan JSON en lugar de los datos de forma plana.

Cuestiones relacionadas