2017-01-26 2 views
0

J'essaye de télécharger un fichier avec PUT en utilisant le module de demandes en python.Python requests PUT méthode crée un fichier 0 byte

mon code est le suivant:

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

Le fichier est créé, je reçois une réponse 200, mais il a 0 octets. Si je ne fais pas quelque chose de mal, je soupçonne que j'ai rencontré le bug .

Est-ce le cas? Si oui existe-t-il une solution de contournement que je peux essayer?

J'ai essayé aussi la même chose avec la bibliothèque httplib2

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

Mais la demande des séjours suspendus à jamais (encore une fois un fichier de taille 0 est créé). Serait-ce aussi le même problème avec le module demandes?

[EDIT] Quelques informations supplémentaires.

Le service recevant le PUT s'exécute sur un hyperviseur ESXi. Il a une fonction où, si vous faites une requête PUT authentifiée, il stocke le fichier de la requête dans/tmp. Le côté serveur fonctionne (testé avec un script perl qui fait le même travail et aussi avec curl).

Le fichier téléchargé est un fichier .tgz qui se trouve sur mon système de fichiers local et l'adresse URL est sous la forme "http://esx-server/tmp/file.tgz".

+2

Quel service reçoive ce PUT? Où le fichier est-il créé? –

+0

Veuillez [modifier] inclure un [mcve]. – davidism

+0

Essayez de changer 'data' en' files' et passez '{'file': payload}'. –

Répondre

0

Donc, il semble qu'il y ait une sorte de bug en effet.

Ma solution était d'utiliser l'urllib2. Ce n'est pas aussi "propre" que les demandes. Mais encore mieux que ce que je pensais que ce serait.

Mon code de travail est maintenant:

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)