2010-06-28 5 views
0

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?

Répondre

0

Votre problème a plus à voir avec le format de votre code, et non avec sa logique. Autrement dit, vous avez des erreurs de syntaxe.

Le message d'erreur que vous avez inclus indique que la ligne if hasattr(content, 'chunks'): se produit dans la méthode __init__, ce qui suggère que l'interprète vous croit être en train de définir la méthode de _save en fonction dans le périmètre de la méthode init. Votre indentation, bien que pas entièrement claire ici sur StackOverflow, semble malpropre et peut être la cause de cette confusion. Python est très sensible aux erreurs d'indentation.

+0

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/). –

+0

Intéressant, je n'étais pas du tout conscient des expressions de générateur. J'ai édité ma réponse en conséquence. –

Questions connexes