Как передать список python в запросе post? - PullRequest
8 голосов
/ 08 декабря 2008

Я хочу отправить несколько строк в списке при вызове POST. например:

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

Код Python получает данные в виде одной строки (вместо списка строк). Как мне опубликовать его в виде списка строк?

Ответы [ 8 ]

8 голосов
/ 08 декабря 2008

В URL не существует такого понятия, как «список строк» ​​(или практически что-либо в HTTP - если вы указываете несколько значений для одного и того же заголовка, они появляются как одно значение с разделителями в большинстве IME-структур веб-приложений) , Это просто одна строка. Я предлагаю вам как-то разграничить строки (например, через запятую), а затем снова разобрать их на другом конце.

5 голосов
/ 08 декабря 2008

TRY JSON (нотация объектов JavaScript) доступна в пакете python. Узнайте здесь: http://docs.python.org/library/json.html

Вы можете закодировать свой список в массив, представленный в JSON, и добавить к аргументу post. Позже расшифруем его обратно в список ...

2 голосов
/ 15 января 2010

Если вы не можете или не хотите просто разделять их запятыми и хотите отправить их в виде списка. У меня есть список номеров, которые я хочу передать, и я использую веб-сервис PHP на другом конце, я не хочу перестраивать свой веб-сервис, так как я использовал общий элемент множественного выбора, предоставленный Zend Framework.

Этот пример отлично работает для меня и моих маленьких целых чисел, и он будет работать с вашими строками, я на самом деле не выполняю urllib.quote (s), я просто делаю str (s).

Импорт urllib

import urllib

Ваш список укусов:

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

Объединить список строк с помощью 'post_data [] =', также urlencode строки

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

Сообщения на http://example.com/

urllib.urlopen('http://example.com/',post_data)
2 голосов
/ 08 декабря 2008

Форматирование входящих аргументов зависит от вашего сервера. например, когда zope получает запрос вроде этого: http://www.zope.org Идентификаторы: список = 1 & Идентификаторы: список = 2

вы можете получить идентификаторы в виде списка. Но эта функция зависит от сервера. Если ваш сервер не поддерживает какой-либо анализ и проверку ваших входных данных, вы должны реализовать это самостоятельно. Или вы используете Zope.

2 голосов
/ 08 декабря 2008

Вы говорите об этом?

post_data= ",".join( list_of_strings )
2 голосов
/ 08 декабря 2008

Если большая строка, которую вы получаете, просто ограничена, то вы можете попробовать ее разбить. См. Разделение строк .

Чтобы уточнить, вы получите разделенный список строк, разделите этот список на список Python и вуаля! У вас есть список Python ...

1 голос
/ 08 декабря 2008

Данные, передаваемые в оператор POST, (насколько я понял) кодируются в виде пар ключ-значение с использованием кодировки application / x-www-form-urlencoded.

Итак, я предполагаю, что вы представляете свой список строк как следующий словарь:

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

Затем передать его в качестве аргумента POST так же сложно, как прочитать документацию по urllib.

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

Обратите внимание, что Google не использует POST для своих поисковых запросов, но вы увидите ошибку, сообщенную Google.

Если вы запустите WireShark при наборе кода выше, вы увидите, что данные POST передаются как:

 s3=python&s2=love&s1=I
0 голосов
/ 09 декабря 2008

Структура данных, подобная django.utils.datastructures.MultiValueDict, является чистым способом представления таких данных. AFAIK это сохраняет порядок.

>>> 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 использует django.http.QueryDict (подкласс MultiValueDict) для преобразования строки запроса в примитивы python и обратно.

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

Вы должны быть в состоянии скопировать эти классы и использовать их в своем проекте. (Хотя я не проверил все зависимости)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...