2015-12-14 8 views
5

azure-storageをDjangoで直接使用する方法はありますか?私は現在、私のDjangoアプリ(Azure VMでUbuntu OSでホストされています)にAzure Cloud Storageを設定しようとしているため、django-storagesはAzure Storage SDKと正しくインターフェースしていないようです(既知の問題:see here)。私のDjangoバージョンが< 1.6.2であれば、そこにリストされている修正は私にとってはうまくいかないでしょう。DjangoでAzure Storage SDKを使用する(完全にdjango-storageへの依存関係を取り除く)

このように私はAzureストレージをDjangoで直接使用する必要があります。誰もそれを前に設定していますか?私は画像mp3sをCloud Storageに保存する必要があります。


現在、私のmodels.pyで、私が持っている:

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) 

そしてdjango-storagesboto残りの世話をします。しかし、私はAzureのクラウドストレージとジャンゴ・ストレージをフックアップするとき、私は次のエラーを取得:

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 

を、コードの関連するスニペットは、次のとおりです。

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

のAzureへの接続ようですコンテナに問題があります。私のsettings.pyでは、私が持っている:

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

先に述べたように、私は完全にジャンゴ・ストレージをバイパスするソリューションを必要とし、ちょうど仕事を得るためにAzureストレージSDKに依存しています。

注:必要な場合に備えて、詳細をお尋ねください。

答えて

2

一般的なpythonアプリケーションでsdkを使用するのと同じように、Djangoアプリケーションで直接Azure-Storage python SDKを使用できます。開始するにはofficial guideを参照してください。ここで

はDjangoアプリケーションのテストコードスニペットです:

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

すばやく 'PROJECT_ROOT'が何であるかを明確にすることはできますか? –

+0

OSのアプリケーションの絶対パスは –

+0

です。ImageField属性の 'upload_to'を' blob_service.put_block_blob_from_path'(または 'put_block_blob_from_file')でオーバーライドする必要がありますか? –

関連する問題