2014-09-29 62 views
1

所以我試圖用Python發佈一個簡單的東西到我的頁面上。Python請求發佈不發送字符串

r = requests.Session().post(
    'http://mypage.com/add?token=%s&title=%s&opt=&opt=true&token=%s' % (token, title, token), 
    headers = headers, 
    proxies = proxy, 
    timeout = max_timeout, 
    ) 

的問題是:如果title例如Hello World!它完美,但如果titleHello World! Visit www.google.com將無法​​正常工作。

我到目前爲止已經發現的是,title字符串不會發送,如果它包含標點,在這種情況下www.google.com有兩個.所以它不會發布...

這是正常的在Python?我也試着使用urllib.quoteurllib.urlencode多,但同樣的結果...

另外,如果你問我爲什麼不使用data = mydatapost()對象是因爲,如果你已經注意到了,我使用帕拉姆tokenopt兩次,所以如果我做一個data對象是這樣的:

data = { 
    "token": token, 
    "title": "title", 
    "opt": "", 
    "opt": 'value', 
    "token": token 
} 

顯然它不會工作,因爲它複製了key值。

+0

您發佈的空身但是,你只使用查詢參數。 – 2014-09-29 16:43:34

回答

3

您正在POST一個空的主體,並且只使用查詢參數。 requests可以在請求參數和POST主體中發送重複鍵。所有你需要做的就是使用鍵值元組序列,而不是一本字典的:

params = [ 
    ("token", token), 
    ("title", "title"), 
    ("opt", ""), 
    ("opt", 'value'), 
    ("token": token), 
] 

的查詢參數或應用程序/ x-WWW的形式了urlencoded POST體中使用時,這些將被編碼爲你。

爲了把這些作爲POST主體,使用data關鍵字參數:

requests.post('http://mypage.com/add', data=params, 
       headers = headers, proxies = proxy, timeout = max_timeout) 

或使用params發送這些作爲查詢參數(在URL):

requests.post('http://mypage.com/add', params=params, 
       headers = headers, proxies = proxy, timeout = max_timeout) 
+0

謝謝Martijn Pieters我會盡快回家測試,但看起來你知道你在說什麼,所以我認爲它會工作:) – 2014-09-29 17:05:49

+0

這是完美的工作!謝謝 :) – 2014-09-29 19:30:09