diff options
| author | Yuval Adam <yuval@segmanta.com> | 2014-03-20 17:49:16 +0200 |
|---|---|---|
| committer | Yuval Adam <yuval@segmanta.com> | 2014-03-20 17:49:16 +0200 |
| commit | 75f93a3f7854a7383febd047391e2bfd4caceee0 (patch) | |
| tree | d5e634ef292c6b84acacc3982dbcaa0d300a346e /storages/backends/azure_storage.py | |
Diffstat (limited to 'storages/backends/azure_storage.py')
| -rw-r--r-- | storages/backends/azure_storage.py | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/storages/backends/azure_storage.py b/storages/backends/azure_storage.py new file mode 100644 index 0000000..96ef082 --- /dev/null +++ b/storages/backends/azure_storage.py @@ -0,0 +1,65 @@ +import os.path + +from django.core.files.base import ContentFile +from django.core.files.storage import Storage +from django.core.exceptions import ImproperlyConfigured + +try: + import azure + import azure.storage +except ImportError: + raise ImproperlyConfigured( + "Could not load Azure bindings. " + "See https://github.com/WindowsAzure/azure-sdk-for-python") + +from storages.utils import setting + + +def clean_name(name): + return os.path.normpath(name).replace("\\", "/") + + +class AzureStorage(Storage): + account_name = setting("AZURE_ACCOUNT_NAME") + account_key = setting("AZURE_ACCOUNT_KEY") + azure_container = setting("AZURE_CONTAINER") + + def __init__(self, *args, **kwargs): + super(AzureStorage, self).__init__(*args, **kwargs) + self._connection = None + + @property + def connection(self): + if self._connection is None: + self._connection = azure.storage.BlobService( + self.account_name, self.account_key) + return self._connection + + def _open(self, name, mode="rb"): + contents = self.connection.get_blob(self.azure_container, name) + return ContentFile(contents) + + def exists(self, name): + try: + self.connection.get_blob_properties( + self.azure_container, name) + except azure.WindowsAzureMissingResourceError: + return False + else: + return True + + def delete(self, name): + self.connection.delete_blob(self.azure_container, name) + + def size(self, name): + properties = self.connection.get_blob_properties( + self.azure_container, name) + return properties["content-length"] + + def _save(self, name, content): + self.connection.put_blob(self.azure_container, name, + content, "BlockBlob") + return name + + def url(self, name): + return "%s/%s" % (self.azure_bucket, name) |
