2017-01-26 2 views
0

Я пытаюсь загрузить файл с помощью PUT с помощью модуля запросов в python.Python просит метод PUT создает файл с нулевым байтом

мой код это:

with open(file, 'rb') as payload: 
    r = requests.put(url, data=payload, auth=('username', 'password')) 

Файл создается, я получаю ответ 200, но он имеет 0 байт. Если я не ошибаюсь, я подозреваю, что встретил ошибку here.

В этом случае? Если да, есть ли способ обхода, который я могу попробовать?

Я пробовал также то же самое с библиотекой httplib2

with open(file, 'rb') as payload: 
    h = httplib2.Http(".cache") 
    h.add_credentials('user', 'pass') 
    resp, content = h.request(url, "PUT", body=payload) 

Но запрос остается висеть навсегда (опять файл 0 размера создается). Не может ли быть такая же проблема с модулем запросов?

[EDIT] Дополнительная информация.

Служба, получающая PUT, работает на гипервизоре ESXi. У него есть функция, где, если вы делаете запрос с выключенным PUT, он сохраняет файл запроса в/tmp. Сервер работает (протестировал его с помощью скрипта perl, который выполняет ту же работу, а также с завихрением).

Загруженный файл представляет собой файл .tgz, который находится на моей локальной файловой системе, а url - в виде "http://esx-server/tmp/file.tgz".

+2

Какие услуги получает этот PUT? Где создается файл? –

+0

Пожалуйста, выберите [mcve]. – davidism

+0

Попробуйте изменить 'data' на' files' и передать '{'file': payload}'. –

ответ

0

Так что кажется, что есть какая-то ошибка.

Моим решением было использовать urllib2. Это не так «чисто», как запросы. Но все же лучше, чем я думал.

Мой рабочий код сейчас:

import urllib2 
from base64 import b64encode 

with open(source, 'rb') as file: 
    data = file.read() 
request = urllib2.Request(url) 
request.add_data(data) 
request.add_header('Authorization', 'Basic ' + b64encode(username + ':' + password)) 
request.get_method = lambda: "PUT" 
r = urllib2.urlopen(request)