2013-10-13 81 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'?__是有效的。 'requests'文件只聲明一個字典應該作爲'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{...}
  • dictOrderedDict採取序列參數
  • 您的元組的列表中有('e':8,'data[1]','9')。應該可能是('e',8),('data[1]','9')

這將產生一個字典(這等同於工作字典字面你貼),這將總是無序

​​

這將產生一個元組的元組,這不要求作爲參數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)提到'request'的'data'參數可以採用作爲參數的元組列表。你從哪裏收集這些信息?謝謝! – 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

奇妙的挖掘。'_encode_params'上的文檔字符串提供了我正在尋找的細節:''將參數作爲字典或2元組列表成功編碼。如果數據是2元組的列表,但是如果參數是以字典形式提供。「在我的情況下,如果POST表單數據出錯,服務器拒絕了表單。使用元組列表'[(a,b),...]'解決了這個問題。 – cod3monk3y