2015-12-14 8 views
5

Hat jemand irgendwelche Tipps zur Verwendung von azure-storage direkt mit Django? Ich frage, weil ich derzeit versuche, Azure Cloud Storage für meine Django-App (gehostet auf Azure VM mit Ubuntu OS) einzurichten, und django-storages scheint nicht korrekt mit Azure Storage SDK Schnittstelle (bekanntes Problem: see here). Der dort aufgelistete Fix funktioniert nicht, wenn meine Django-Version < ist. 1.6.2.Verwenden von Azure Storage SDK mit Django (und Entfernen der Abhängigkeit von Django-Speichern vollständig)

Also muss ich Azure-Speicher direkt mit Django verwenden. Hat jemand das schon mal gemacht? Ich muss Bilder und mp3s auf dem Cloud Storage speichern.


Derzeit in meinem models.py, ich habe:

def upload_to_location(instance, filename): 
    try: 
     blocks = filename.split('.') 
     ext = blocks[-1] 
     filename = "%s.%s" % (uuid.uuid4(), ext) 
     instance.title = blocks[0] 
     return os.path.join('uploads/', filename) 
    except Exception as e: 
     print '%s (%s)' % (e.message, type(e)) 
     return 0 

class Photo(models.Model): 
    description = models.TextField(validators=[MaxLengthValidator(500)]) 
    submitted_on = models.DateTimeField(auto_now_add=True) 
    image_file = models.ImageField(upload_to=upload_to_location, null=True, blank=True) 

Und dann django-storages und boto kümmern sich um den Rest. Allerdings, wenn ich django-Speicher bis mit Azure Cloud Storage Haken, ich die folgenden Fehlermeldung erhalten:

Exception Value:  
'module' object has no attribute 'WindowsAzureMissingResourceError' 

Exception Location:  
/home/mhb11/.virtualenvs/myvirtualenv/local/lib/python2.7/site-packages/storages/backends/azure_storage.py in exists, line 46 

und den relevanten Ausschnitt aus dem Code ist:

def exists(self, name): 
    try: 
     self.connection.get_blob_properties(
      self.azure_container, name) 
    except azure.WindowsAzureMissingResourceError: 
     return False 
    else: 
     return True 

Es scheint, dass die Verbindung zum Azure Behälter versagt. In meinem settings.py, ich habe:

DEFAULT_FILE_STORAGE = 'storages.backends.azure_storage.AzureStorage' 
    AZURE_ACCOUNT_NAME = 'photodatabasestorage' 
    AZURE_ACCOUNT_KEY = 'something' 
    AZURE_CONTAINER = 'somecontainer' 

Wie bereits beschrieben, ich brauche eine Lösung, die django-Speicher vollständig umgeht, und verlässt sich nur auf Azure Storage SDK die Arbeit zu erledigen.

Hinweis: Fragen Sie mich nach weiteren Informationen, falls Sie diese benötigen.

Antwort

2

Wir können Azure-Storage python SDK direkt in den Django-Apps verwenden, genauso wie die SDK in gängigen Python-Anwendungen. Sie können sich auf official guide für den Anfang beziehen.

Hier ist der Test Code-Schnipsel in der Django App:

def putfiles(request): 
blob_service = BlobService(account_name=accountName, account_key=accountKey) 
PROJECT_ROOT = path.dirname(path.abspath(path.dirname(__file__))) 
try: 
    blob_service.put_block_blob_from_path(
      'mycontainer', 
      '123.jpg', 
      path.join(path.join(PROJECT_ROOT,'uploads'),'123.jpg'), 
      x_ms_blob_content_type='image/jpg' 
    ) 
    result = True 
except: 
    print(sys.exc_info()[1]) 
    result = False 
return HttpResponse(result) 


def listfiles(request): 
    blob_service = BlobService(account_name=accountName, account_key=accountKey) 
    blobs = [] 
    result = [] 
    marker = None 
    while True: 
     batch = blob_service.list_blobs('mycontainer', marker=marker) 
     blobs.extend(batch) 
     if not batch.next_marker: 
      break 
     marker = batch.next_marker 
    for blob in blobs: 
     result.extend([{'name':blob.name}]) 
    return HttpResponse(json.dumps(result)) 
+0

Können Sie schnell klären, was 'PROJECT_ROOT' ist? –

+0

Es ist der ABS-Pfad Ihrer Anwendung in OS –

+0

Hmm, also muss ich 'upload_to' irgendwie in meinem ImageField-Attribut mit' blob_service.put_block_blob_from_path' (oder 'put_block_blob_from_file') überschreiben? –

Verwandte Themen