2010-11-15 4 views
1

Я пытаюсь отправить данные POST с помощью urllib, но проблема, как правило, вы urlencode для вашего словаря полей, а затем вы отправляете это вместе с вашим запросом. Но некоторые из моих полей, которые я должен отправить на сервер, называются точно такими же именами, поэтому, используя словарь, я в конечном итоге удаляю много моих данных из словаря, потому что у вас не может быть двух ключей с одинаковым именем и разные данные.Python urllib2 отправка POST-данных

У меня есть данные запроса в виде строки в правильном синтаксисе (например, переменная = значение & вар = значение2 & ...), и я пытаюсь отправить, что вместе с моей просьбе URLLIB, но я получаю плохой запрос каждый раз. Есть ли другой способ urlencode данных перед отправкой, чтобы я не получил 400?

+0

Вы уверены, что 400 из-за формата данных POST, а не что-то еще (например, заголовок пользовательского агента)? – SimonJ

ответ

6

urllib.urlencode() может взять список кортежей, что позволяет указать несколько значений параметра:

>>> urlencode([("var", "value"), ("var", "value2")]) 
'var=value&var=value2' 

Или использовать карту со списками как значения:

>>> p = {"var": ["value", "value2"], "var2": ["yetanothervalue"]} 
>>> urlencode([(k, v) for k, vs in p.items() for v in vs]) 
'var=value&var=value2&var2=yetanothervalue' 

Можно даже позволить списки или строки как значения, хотя он становится менее кратким:

>>> p = {"var": ["value", "value2"], "var2": "yetanothervalue"} 
>>> urlencode([(k, v) for k, vs in p.items() 
...  for v in isinstance(vs, list) and vs or [vs]]) 
'var=value&var=value2&var2=yetanothervalue'