Уведомления

Группа в Telegram: @pythonsu

#1 Март 26, 2011 11:42:13

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

не могу отправить файл с помощью urllib

задача простая - отправить ПОСТ-запрос, ссылающийся на бинарный файл, так чтобы файл был отправлен на сервер
multipart/form-data

пока получилось это сделать только для питона 2.7 с библиотекой poster
http://pypi.python.org/pypi/poster/

но мне надо для питона 3.2

в постере есть какой-то хитрый класс multipart_yielder, который возвращает итератор
<poster.encode.multipart_yielder object at 0x930cf4c>

этот итератор можно передать в request urllib-а:

datagen, headers = multipart_encode({"image1": open("image.png", "rb")})
response = opener.open(request, datagen, headers)
разобраться в нем и сделать свой итератор пока не представляется возможным, поэтому попробовал тупо запустить этот код на питоне 3.2
исправил кучу ошибок, но последнюю не знаю как исправить:

Traceback (most recent call last):
File "/home/tmp/poster-0.8.0/test.py", line 20, in <module>
response = opener.open(request, datagen, headers)
File "/usr/local/lib/python3.2/urllib/request.py", line 366, in open
response = self._open(req, data)
File "/usr/local/lib/python3.2/urllib/request.py", line 384, in _open
'_open', req)
File "/usr/local/lib/python3.2/urllib/request.py", line 344, in _call_chain
result = func(*args)
File "/usr/local/lib/python3.2/urllib/request.py", line 1140, in http_open
return self.do_open(http.client.HTTPConnection, req)
File "/usr/local/lib/python3.2/urllib/request.py", line 1122, in do_open
h.request(req.get_method(), req.selector, req.data, headers)
File "/usr/local/lib/python3.2/http/client.py", line 964, in request
self._send_request(method, url, body, headers)
File "/usr/local/lib/python3.2/http/client.py", line 1002, in _send_request
self.endheaders(body)
File "/usr/local/lib/python3.2/http/client.py", line 960, in endheaders
self._send_output(message_body)
File "/usr/local/lib/python3.2/http/client.py", line 805, in _send_output
self.send(msg)
File "/usr/local/lib/python3.2/http/client.py", line 743, in send
self.connect()
File "/usr/local/lib/python3.2/http/client.py", line 721, in connect
self.timeout, self.source_address)
File "/usr/local/lib/python3.2/socket.py", line 386, in create_connection
sock.settimeout(timeout)
TypeError: a float is required
что это вообще за ошибка?
есть ли нормальный способ отправить файл на сервер с помощью urllib в питон3.2?



Офлайн

#2 Март 26, 2011 11:56:06

cookie-god
От:
Зарегистрирован: 2011-03-13
Сообщения: 41
Репутация: +  0  -
Профиль   Отправить e-mail  

не могу отправить файл с помощью urllib

urllib2_file



Офлайн

#3 Март 26, 2011 12:10:39

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

не могу отправить файл с помощью urllib

для питона 3.2?



Офлайн

#4 Март 26, 2011 12:31:26

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

не могу отправить файл с помощью urllib

http://www.doughellmann.com/PyMOTW/urllib2/index.html#uploading-files
Переделать на тройку труда не составит.



Офлайн

#5 Март 26, 2011 13:07:34

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

не могу отправить файл с помощью urllib

спасибо
привел их пример к такому виду: http://pastebin.mozilla.org/1192545

получаю вот что:

  File "/home/python3/urllib_test/start_file.py", line 70, in __str__
return '\r\n'.join(flattened)
TypeError: sequence item 12: expected str instance, bytes found
а если заменить
              'Content-Type: %s' % content_type,
'',
body,
на
              'Content-Type: %s' % content_type,
'',
str(body),
получаем
    raise TypeError("POST data should be bytes"
TypeError: POST data should be bytes or an iterable of bytes. It cannot be str.



Отредактировано (Март 26, 2011 13:16:53)

Офлайн

#6 Март 26, 2011 13:47:20

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

не могу отправить файл с помощью urllib

так ведь к байтам нужно приводить, а не к строке.
Игнат, похоже вы все еще недостаточно хорошо их различаете



Офлайн

#7 Март 26, 2011 13:59:56

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

не могу отправить файл с помощью urllib

а, господи
это при отправке надо делать

    request.add_data(bytes(body, 'utf8'))
только вот утф ли указывать?
с утф работает



Отредактировано (Март 26, 2011 14:03:53)

Офлайн

#8 Март 26, 2011 14:16:48

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

не могу отправить файл с помощью urllib

Нет, так нельзя. Вы о конструкциях вроде b'Content-Type' слышали?



Офлайн

#9 Март 26, 2011 17:40:40

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

не могу отправить файл с помощью urllib

я знаю только что это http-заголовок
а что не так?



Офлайн

#10 Март 26, 2011 23:01:47

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

не могу отправить файл с помощью urllib

b'строка байтов'



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version