Найти - Пользователи
Полная версия: urllib.urlencode() Баг или так и задумано?
Начало » Python для новичков » urllib.urlencode() Баг или так и задумано?
1 2
Iskatel
import urllib
print urllib.urlencode({'data':'te st'})

печатает data=te+st

Откуда этот плюс? как передать строку с пробелами?

UPD:
import urllib
 
s = ''
for i in xrange(256):
    s+=chr(i)
 
enc = urllib.urlencode({'data':s})
 
for i,t in enumerate(urllib.unquote(enc[5:])):
        if s[i] != t:
            print repr(s[i]), repr(t)

показывает что такое несовпадение только на пробеле…

Python 2
FishHook
Iskatel
Iskatel
Откуда этот плюс?
пробел в УРЛах никогда не используется
по теме
Iskatel
FishHook
пробел в УРЛах никогда не используется
Так это данные для POST, причем эдесь УРЛ
Iskatel
Точнее в многочисленных примерах отправки POST используется:

data_to_send = urllib.urlencode({'data':data})
urllib2.urlopen(addr, data_to_send)

С одной стороны вроде УРЛ в названии функции, с другой - примеры то существуют, и их много. А про такой подводный камень нигде не описано.

ЗЫ. засунул все в Base64
FishHook
Iskatel
Так это данные для POST, причем эдесь УРЛ
Да какая разница то, ПОСТ кодируется точно так же как ГЕТ
https://ru.wikipedia.org/wiki/POST_(HTTP)
FishHook
Когда веб-браузер отправляет POST запрос с элементами веб-формы, по умолчанию интернет тип данных медиа это: «application/x-www-form-urlencoded». Это формат для кодирования пар ключ-значение с возможностью дублирования ключей. Каждая пара ключ-значение отделяется символом &, ключ отделен от значения символом = . В ключах и значениях пробелы заменяются на знак +, и затем, используя URL-кодирование, заменяются все не буквенно-цифровые символы.
Например,
Name: Jonahan Doe
Age: 23
Formula: a + b == 13 %!
будет закодировано как
Name=Jonathan+Doe&Age=23&Formula=a+%2B+b+%3D%3D+13 %25%21
Начиная с HTML 4.0, формы могут также представить данные в multipart/form, как определено в RFC 2388(см. также RFC 1867 для более ранней экспериментальной версии определенной как расширение HTML 2.0 и упоминаемой в HTML 3.2). Частный случай метода POST при обращении на ту же страницу, которой принадлежит форма, называется обратной передачей.
Iskatel
Тоесть если, при приеме, сначала заменить все “+” в строке на “ ” то все будет ОК? Сам плюс (если был во входных данных) всегда закодируется в %2B?

Или все же лучше Base64?
Или заморочится таки с multipart?

Что правильнее? (Проще?) В общем случае передавать нужно бинарные данные, т.е. весь диапазон 0-255.
ЗЫ. Передавать на свой же сервер (BaseHTTPServer)
FishHook
Iskatel
Тоесть если, при приеме, сначала заменить все “+” в строке на “ ” то все будет ОК?
Я так думаю, что при приеме нужно применить функцию обратную urlencode.
Iskatel
FishHook
Я так думаю, что при приеме нужно применить функцию обратную urlencode.
В соседней ветке мне подсказали urllib.unquote() - она вроде и есть обратная, но плюс оставляет.
J.R.
.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB