Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 5, 2015 13:50:18

Iskatel
Зарегистрирован: 2015-07-29
Сообщения: 291
Репутация: +  3  -
Профиль   Отправить e-mail  

urllib.urlencode() Баг или так и задумано?

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

Отредактировано Iskatel (Сен. 5, 2015 14:06:09)

Офлайн

#2 Сен. 5, 2015 14:18:40

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

urllib.urlencode() Баг или так и задумано?

Iskatel

Iskatel
Откуда этот плюс?
пробел в УРЛах никогда не используется
по теме



Офлайн

#3 Сен. 5, 2015 14:20:30

Iskatel
Зарегистрирован: 2015-07-29
Сообщения: 291
Репутация: +  3  -
Профиль   Отправить e-mail  

urllib.urlencode() Баг или так и задумано?

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

Офлайн

#4 Сен. 5, 2015 14:24:59

Iskatel
Зарегистрирован: 2015-07-29
Сообщения: 291
Репутация: +  3  -
Профиль   Отправить e-mail  

urllib.urlencode() Баг или так и задумано?

Точнее в многочисленных примерах отправки POST используется:

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

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

ЗЫ. засунул все в Base64

Отредактировано Iskatel (Сен. 5, 2015 14:26:05)

Офлайн

#5 Сен. 5, 2015 14:35:53

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

urllib.urlencode() Баг или так и задумано?

Iskatel
Так это данные для POST, причем эдесь УРЛ
Да какая разница то, ПОСТ кодируется точно так же как ГЕТ
https://ru.wikipedia.org/wiki/POST_(HTTP)



Офлайн

#6 Сен. 5, 2015 14:36:41

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

urllib.urlencode() Баг или так и задумано?

Когда веб-браузер отправляет 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 при обращении на ту же страницу, которой принадлежит форма, называется обратной передачей.



Офлайн

#7 Сен. 5, 2015 14:45:17

Iskatel
Зарегистрирован: 2015-07-29
Сообщения: 291
Репутация: +  3  -
Профиль   Отправить e-mail  

urllib.urlencode() Баг или так и задумано?

Тоесть если, при приеме, сначала заменить все “+” в строке на “ ” то все будет ОК? Сам плюс (если был во входных данных) всегда закодируется в %2B?

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

Что правильнее? (Проще?) В общем случае передавать нужно бинарные данные, т.е. весь диапазон 0-255.
ЗЫ. Передавать на свой же сервер (BaseHTTPServer)

Отредактировано Iskatel (Сен. 5, 2015 15:03:24)

Офлайн

#8 Сен. 5, 2015 15:20:35

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

urllib.urlencode() Баг или так и задумано?

Iskatel
Тоесть если, при приеме, сначала заменить все “+” в строке на “ ” то все будет ОК?
Я так думаю, что при приеме нужно применить функцию обратную urlencode.



Офлайн

#9 Сен. 5, 2015 15:23:57

Iskatel
Зарегистрирован: 2015-07-29
Сообщения: 291
Репутация: +  3  -
Профиль   Отправить e-mail  

urllib.urlencode() Баг или так и задумано?

FishHook
Я так думаю, что при приеме нужно применить функцию обратную urlencode.
В соседней ветке мне подсказали urllib.unquote() - она вроде и есть обратная, но плюс оставляет.

Отредактировано Iskatel (Сен. 5, 2015 15:24:04)

Офлайн

#10 Сен. 5, 2015 15:28:51

J.R.
Зарегистрирован: 2015-07-18
Сообщения: 147
Репутация: +  16  -
Профиль  

urllib.urlencode() Баг или так и задумано?

.

Отредактировано J.R. (Фев. 28, 2016 12:35:38)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version