2013-10-13 6 views
1

Как я могу отправить упорядоченные параметры в запросах?запросил параметры параметров python

Я попытался следующие, но ни один из них не работает:

payload = dict{('f','1'),('s','2'),('t','3'),('f','4'),('ft','5'),('s','6'),('se','7'),('e':8,'data[1]','9'),('t','10'),('el','1q'),('data[2]','12'),('data[3]','13'),('data[4]','14'),('htmldata[5]','15')} 

payload = OrderedDict{('f','1'),('s','2'),('t','3'),('f','4'),('ft','5'),('s','6'),('se','7'),('e':8,'data[1]','9'),('t','10'),('el','1q'),('data[2]','12'),('data[3]','13'),('data[4]','14'),('htmldata[5]','15')} 

payload = (('f','1'),('s','2'),('t','3'),('f','4'),('ft','5'),('s','6'),('se','7'),('e':8,'data[1]','9'),('t','10'),('el','1q'),('data[2]','12'),('data[3]','13'),('data[4]','14'),('htmldata[5]','15')) 

payload = ([('f','1'),('s','2'),('t','3'),('f','4'),('ft','5'),('s','6'),('se','7'),('e':8,'data[1]','9'),('t','10'),('el','1q'),('data[2]','12'),('data[3]','13'),('data[4]','14'),('htmldata[5]','15')]) 

Ошибка я получаю:

SyntaxError: invalid syntax 

Это один почтовые параметры в случайном порядке без ошибки:

payload = {'f':'1','s':'2','t':'3','f':'4','ft':'5','s':'6','se':'7','e':8,'data[1]':'9','t':'10','el':'1q','data[2]':'12','data[3]':'13','data[4]':'14','htmldata[5]':'15'} 

Как я могу отправить упорядоченные параметры, используя следующий код?

c = requests.post(url, params = payload) 
+0

Знание OP в питона представляется ограниченным ко мне, но вопрос __How я могу размещать упорядоченные Params с помощью 'запросы'? __ действительны. В документации 'request' указано только, что словарь должен быть передан как аргумент' data'/'params', и ничего не говорится о том, как упорядочить ключи. Спецификация HTTP указывает, что 'application/x-www-form-urlencoded' следует передавать« в том порядке, в котором они отображаются в документе »[8.2.1] (http://www.w3.org/MarkUp/html-spec /html-spec_8.html#SEC8.2.1). Поэтому, если вам удастся автоматизировать запись в форме, вам может понадобиться эта информация. – cod3monk3y

ответ

4
  • dict{...} неправильно, он должен быть dict(...). То же самое относится и к OrderedDict{...}
  • dict и OrderedDict взять последовательность в качестве аргумента
  • у вас есть ('e':8,'data[1]','9') в списке кортежей. Вероятно, должно быть ('e',8),('data[1]','9').

Это производит ДИКТ (это эквивалентно действию ДИКТ литерале писал), который будет всегда быть неупорядоченным:

payload = dict([('f','1'),('s','2'),('t','3'),('f','4'),('ft','5'),('s','6'),('se','7'),('e', 8),('data[1]','9'),('t','10'),('el','1q'),('data[2]','12'),('data[3]','13'),('data[4]','14'),('htmldata[5]','15')]) 

Это производит кортеж кортежей, который запросы не принимаются в качестве аргумента для data:

payload = (('f','1'),('s','2'),('t','3'),('f','4'),('ft','5'),('s','6'),('se','7'),('e', 8),('data[1]','9'),('t','10'),('el','1q'),('data[2]','12'),('data[3]','13'),('data[4]','14'),('htmldata[5]','15')) 

Остальные два (упорядоченный словарь и список кортежей) будет производить то, что вы хотите:

from collections import OrderedDict 
payload = OrderedDict([('f','1'),('s','2'),('t','3'),('f','4'),('ft','5'),('s','6'),('se','7'),('e',8),('data[1]','9'),('t','10'),('el','1q'),('data[2]','12'),('data[3]','13'),('data[4]','14'),('htmldata[5]','15')]) 
payload = [('f','1'),('s','2'),('t','3'),('f','4'),('ft','5'),('s','6'),('se','7'),('e', 8),('data[1]','9'),('t','10'),('el','1q'),('data[2]','12'),('data[3]','13'),('data[4]','14'),('htmldata[5]','15')] 
+0

Спасибо за ясность в этом. Я искал способ заказать параметры POST, и * просто * попробовал 'OrderedDict', который работал отлично. Я не вижу [никакой документации] (http://docs.python-requests.org/en/latest/api/?highlight=post#requests.post), в которой упоминается, что аргумент 'data' для' request' может принимать список кортежей в качестве аргумента. Откуда вы собрали эту информацию? Благодаря! – cod3monk3y

+1

Главным образом, глядя на источник ... Соответствующие фрагменты находятся в ['RequestEncodingMixin._encode_params'] (https://github.com/kennethreitz/requests/blob/9dc660269f3270cf60ba5e1fd855e853241218d5/requests/models.py#L76) и [' to_key_value_list'] (https://github.com/kennethreitz/requests/blob/9dc660269f3270cf60ba5e1fd855e853241218d5/requests/utils.py#L145) (посмотрите комментарии и примеры). В основном это означает, что он может принимать либо сопоставление, либо любое итеративное значение, которое дает два набора (большинство параметров, которые могут быть заданы как отображение, делают то же самое). – mata

+0

фантастический рытье.Docstring на '_encode_params' предоставляет детали, которые я искал:' 'Будет успешно кодировать параметры при передаче как dict или список из 2-х кортежей. Порядок сохраняется, если данные представляют собой список из 2-х кортежей, но произвольный, если параметры поставляемый в качестве dict. »« В моем случае сервер отклонил форму, если данные формы POST были не в порядке. Используя список кортежей '[(a, b), ...]' исправил проблему. – cod3monk3y

Смежные вопросы