2014-09-29 1 views
1

Так что я пытаюсь загрузить POST на мою страницу с помощью 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! он работает отлично, но если title является Hello World! Visit www.google.com он не будет работать.

То, что я нашел до сих пор является то, что title строка обыкновение посылать, если он содержит пунктуацию, в этом случае www.google.com имеет два . так это обыкновение отправлять ...

Это нормально в Python? Я также пытался использовать urllib.quoteurllib.urlencode и многое другое, но тот же результат ...

Кроме того, если вы спросите, почему я не использую data = mydata внутри post() объекта, потому что, если вы заметили, я использую параметр может token и opt в два раза, так что если я делаю data объект вроде этого:

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

Очевидно, что это не будет работать, как это имеет дублированные key значения.

+0

Вы проводке но вы используете только параметры запроса. –

ответ

3

Вы отправляете пустое тело и используете только параметры запроса. requests может отправлять дубликаты ключей только в порядке, как в параметрах запроса, так и в теле POST. Все, что вам нужно сделать, это использовать последовательность ключ-значение кортежей вместо словаря:

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

Они будут закодированы для Вас при использовании в качестве параметров запроса или в/х-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. Я буду проверять, как только я вернусь домой, но, похоже, вы знаете, о чем говорите, поэтому я думаю, что это сработает :) –

+0

Это отлично работает! Спасибо :) –