J'essaie d'écrire un système de stockage personnalisé simple.Système de stockage personnalisé dans Django
J'ai seulement besoin que mon système de stockage duplique des fichiers de quelques serveurs FTP.
Sous-classe de stockage ressemble à:
from django.core.files.storage import Storage
from settings import MEDIA_ROOT, MEDIA_URL
import ftplib
import os
class FTPStorage(Storage):
"""FTP Storage class for Django pluggable storage system."""
def __init__(self, mediaroot=MEDIA_ROOT, base_url=MEDIA_URL):
self._netrc=open('netrc')
self._machine=[]
self._login=[]
self._password=[]
def _save(self, name, content):
content.open()
if hasattr(content, 'chunks'):
content_str = ''.join(chunk for chunk in content.chunks())
else:
content_str = content.read()
for line in netrc: #read netrc file
old=line.strip()
line=line.strip().split()
if old.startswith("machine"): machine.append(line[-1])
if old.startswith("login"): login.append(line[-1])
if old.startswith("password"): password.append(line[-1])
for i in range(len(machine)):
try:
ftp = ftplib.FTP(machine[i])
ftp.login(login[i],password[i])
except Exception,e:
print e
else:
ftp.cwd("PublicFolder")
ftp.storbinary("STOR " + os.path.basename(name), StringIO(content_str), "rb", 8*1024)
return name
Mais maintenant, il me donne l'erreur:
line:20, in __init__
if hasattr(content, 'chunks'):
Name error: Global name is not defined.
Puis-je écrire juste la méthode _save
, donc ça va marcher?
Le premier point est correct, mais le second ne l'est pas. L'expression est parfaitement valide - recherchez [expressions de générateur] (http://www.python.org/dev/peps/pep-0289/). –
Intéressant, je n'étais pas du tout conscient des expressions de générateur. J'ai édité ma réponse en conséquence. –