septembre
2010
Dans cet article, on va uploader des fichiers à partir d’un client python vers Django, de manière efficace (streaming côté client et côté serveur). On va uploader le contenu d’un dossier + utiliser l’authentification.
Côté client
Un module très sympa à utiliser est poster. Ca aide à faire des requêtes POST en utilisant le codage multipart/form-data. Le module va nous permettre également de faire du streaming.
Tout d’abord, on crée un cookie:
cj = cookielib.CookieJar()
Ensuite, on a besoin d’importer quelques fonctions du module poster:
from poster.encode import multipart_encode from poster.streaminghttp import StreamingHTTPHandler, StreamingHTTPRedirectHandler, StreamingHTTPSHandler
On crée un opener en utilisant les fonctions de streaming du module poster:
handlers = [StreamingHTTPHandler, StreamingHTTPRedirectHandler, StreamingHTTPSHandler] opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj), *handlers) urllib2.install_opener(opener)
On pourrait utiliser la fonction register_openers() du module poster mais elle ne supporte l’authentification donc on utilise les fonctions internes.
On lit la liste des fichiers du dossier ‘/data’ et on les envoie au serveur.
params = {} dir = u'/data/' for f in os.listdir(dir): params[f] = open(dir+f) data, headers = multipart_encode(params) url = 'https://test/upload.py' req = urllib2.Request(url, data, headers) result = urllib2.urlopen(req)
Côté serveur
On ne veut pas saturer la mémoire vive donc on va lire les données par paquets.
Les fichiers reçus sont dans request.FILES qui est un dictionnaire d’objets de type UploadedFile
Si la taille du fichier est supérieur à 2.5MB (cette limite peut être modifiée dans votre settings.py), il sera divisé en plusieurs paquets pour ne pas utiliser trop de RAM.
On ajoute le code suivant dans views.py pour recevoir les fichiers.
for key, file in request.FILES.items(): path = '/data/'+ file.name dest = open(path.encode('utf-8'), 'wb+') if file.multiple_chunks: for c in file.chunks(): dest.write(c) else: dest.write(file.read()) dest.close()
Voila, tous les fichiers envoyés sont maintenant sur le serveur et cela d’une manière optimisée.
N’hésitez pas à commenter cet article.
Si vous avez aimé cet article, ca serait cool d’aller sur mon site Gourmious pour découvrir et partager vos plats préférés au resto.