2008-12-08 12 views
8

Quiero enviar algunas cadenas en una lista en una llamada POST. por ejemplo:¿Cómo paso una lista de Python en la consulta posterior?

www.example.com/?post_data = A list of strings 

El código python recibe los datos como una cadena única (en lugar de una lista de cadenas). ¿Cómo lo publico como una lista de cadenas?

+0

¿Las cadenas están delimitadas de algún modo? – mepcotterell

+0

sí, están separados por comas. (como en las listas de python habituales) –

+0

¿Desea saber cómo definir el servidor (www.example.com)? ¿O está escribiendo un cliente para algún servidor que ya existe? Si está escribiendo un cliente, ¿qué dice la documentación de la API del servidor? –

Respuesta

8

No existe una "lista de cadenas" en una URL (o en prácticamente nada en HTTP: si especifica varios valores para el mismo encabezado, aparecen como un único valor delimitado en la mayoría de marcos de aplicaciones web IME) Es solo una cadena. Le sugiero que delimite las cadenas de alguna manera (por ejemplo, separadas por comas) y luego las analice de nuevo en el otro extremo.

2

Si la cadena grande que está recibiendo está simplemente delimitada, puede intentar dividirla. Ver Splitting strings.

Para aclarar, se obtiene la lista delimitada de las cuerdas, dividir esa lista en una lista de Python, y voila !, usted tiene una lista de pitón ...

+0

¿Qué sucede si la cadena contiene una coma? usar JSON o serialización sería lo mejor imho – kender

2

¿Estás hablando de esto?

post_data= ",".join(list_of_strings) 
5

TRY JSON (JavaScript Object Notation) está disponible en el paquete python. Averigüe aquí: http://docs.python.org/library/json.html

Puede codificar su lista a una matriz representada en JSON y anexar al argumento de la publicación. Más tarde decodifícalo de nuevo en la lista ...

2

Depende de su servidor formatear los argumentos entrantes. por ejemplo, cuando zope recibe una solicitud como esta: http://www.zope.org?ids:list=1&ids:list=2

puede obtener los ids como una lista. Pero esta característica depende del servidor. Si su servidor no admite algún tipo de análisis y validación de su entrada, debe implementarlo usted mismo. O usas zope.

+0

CherryPy también hace algo similar: si recibe? x = foo & x = bar, entonces le dará ["foo", "bar"] como el valor de x. Pero como dices, esto es específico del servidor. –

1

Los datos que se pasan a una instrucción POST son (por lo que entiendo) codificados como pares clave-valor, utilizando la aplicación/x-www-form-urlencoded encoding.

Por lo tanto, voy a suponer que usted representa a su lista de cadena como la siguiente dictionnary:

>>> my_string_list= { 's1': 'I',             
...  's2': 'love',               
...  's3': 'python'               
... }     

Entonces, pasándole como argumento para POST es tan difícil como la lectura de la documentación de urllib.

>>> import urllib 
>>> print urllib.urlopen('http://www.google.fr/search', 
     urllib.urlencode(my_string_list) 
    ).read() 

en cuenta que Google no utiliza la POST para sus consultas de búsqueda, pero verá el error reportado por Google.

Si ejecuta WireShark mientras se escribe el código anterior, verá los datos del puesto que se pasa como:

s3=python&s2=love&s1=I 
0

Una estructura de datos como django.utils.datastructures.MultiValueDict es una forma limpia para representar estos datos. AFAIK preserva el orden.

>>> d = MultiValueDict({'name': ['Adrian', 'Simon'], 'position': ['Developer']}) 
>>> d['name'] 
'Simon' 
>>> d.getlist('name') 
['Adrian', 'Simon'] 
>>> d.get('lastname', 'nonexistent') 
'nonexistent' 
>>> d.setlist('lastname', ['Holovaty', 'Willison']) 

Django está utilizando django.http.QueryDict (subclase de MultiValueDict) para convertir una cadena de consulta en las primitivas de pitón y la espalda.

from django.http import QueryDict 

qs = 'post_data=a&post_data=b&post_data=c' 

query_dict = QueryDict(qs) 

assert query_dict['post_data'] == 'c' 
assert query_dict.getlist('post_data') == ['a', 'b', 'c'] 
assert query_dict.urlencode() == qs 

Debe poder copiar estas clases y usarlas en su proyecto. (No he revisado todas las dependencias)

2

Si no puede o no desea simplemente separarlos con una coma y desea enviarlos de una manera más simple. Tengo una lista de números que quiero pasar y utilizo un servicio web PHP en el otro extremo, no quiero reconstruir mi servicio web ya que utilicé un elemento común de selección múltiple proporcionado por Zend Framework.

Este ejemplo funciona bien para mí y mis enteros pequeños y lo haría con sus cadenas, actualmente no realizo el urllib.quote (s), simplemente hago str (s).

importación urllib

import urllib 

Su lista de picaduras:

string_list = ['A', 'list', 'of', 'strings', 'and', 'öthér', '.&st,u?ff,'] 

se unen la lista de cadenas con 'post_data [] =', también urlencode la cadena

post_data = '&'.join('post_data[]='+urllib.quote(s) for s in string_list) 

Publicaciones a http://example.com/

urllib.urlopen('http://example.com/',post_data) 
+0

lea cómo formatear su código – SilentGhost

+0

Lo siento, primera vez aquí, voy a obtener bettet. ¡Promesa! – Joelbitar

Cuestiones relacionadas