Django rest 框架 - 将图像上传到 Azure 存储

Posted

技术标签:

【中文标题】Django rest 框架 - 将图像上传到 Azure 存储【英文标题】:Django rest framework - upload images to Azure storage 【发布时间】:2018-10-31 08:52:07 【问题描述】:

django-storages 和 azure-storage 0.36(较新版本会出现大量错误)安装在虚拟环境中,上传似乎正在工作,因为 API 发送了一个带有应该正确链接到图像的响应。但是在 Azure 存储上没有创建任何内容。

只要使用默认的文件上传选项,文件上传就可以正常工作了。

是使用 django-storages 后端还是我应该直接使用 Azure python sdk?

settings.py

INSTALLED_APPS = (
    ....
    'storages'
)

DEFAULT_FILE_STORAGE = 'storages.backends.azure_storage.AzureStorage'
AZURE_ACCOUNT_NAME = "myaccountname"
AZURE_ACCOUNT_KEY = "mykey"
AZURE_CONTAINER = "media"


MEDIA_ROOT = "http://mystorageaccount.blob.core.windows.net/"
MEDIA_URL = "http://mystorageaccount.blob.core.windows.net/media/"

models.py

image = models.ImageField(upload_to='images', null=True, blank=True)

有了这个设置,它似乎工作了

【问题讨论】:

【参考方案1】:

根据 Django 的 official documentation,他们建议安装 Azure 存储 SDK:

Azure 存储 使用 Windows Azure 存储后端的 Django 自定义存储系统。

开始配置之前,您需要安装 Azure SDK for Python。

安装包:

pip install azure

添加到您的需求文件中:

pip freeze > requirements.txt 

您应该使用 SDK。

【讨论】:

我发现here 存在与 azure-storages 相关的 django-storages 包的问题,​​因此对我来说至少工作版本是 azure==1.0.3 和 azure-storage ==0.20.3 天啊,您能否将其添加为答案,以便对社区有所帮助?谢谢,【参考方案2】:
if os.environ.get('ENV') in ['Dev', 'Staging', 'Production']:
    DEFAULT_FILE_STORAGE = 'backend.utils.custom_azure.AzureMediaStorage'
    STATICFILES_STORAGE = 'backend.utils.custom_azure.AzureStaticStorage'

    STATIC_LOCATION = "static"
    MEDIA_LOCATION = "data"

    AZURE_ACCOUNT_NAME = os.environ.get('AZURE_ACCOUNT_NAME', "")
    AZURE_ACCOUNT_KEY = os.environ.get('AZURE_ACCOUNT_KEY', "")
    AZURE_CUSTOM_DOMAIN = f'AZURE_ACCOUNT_NAME.blob.core.windows.net'
    AZURE_BLOB_URL = f'https://AZURE_CUSTOM_DOMAIN'

    AZURE_OVERWRITE_FILES = True

    STATIC_ROOT = f'https://AZURE_CUSTOM_DOMAIN/STATIC_LOCATION/'
    STATIC_URL = f'https://AZURE_CUSTOM_DOMAIN/STATIC_LOCATION/'
    MEDIA_URL = f'https://AZURE_CUSTOM_DOMAIN/MEDIA_LOCATION/'
    
    DATA_PATH = 'data'
else:
    # local environment
    SITE_URL = 'http://127.0.0.1:8050'        
    STATIC_URL = '/static/'
    STATIC_ROOT = os.path.join(BASE_DIR, 'static/')

    MEDIA_ROOT = os.path.join(BASE_DIR, 'data/')     # 'media/'
    MEDIA_URL = '/data/'    # '/media/'
    
    DATA_PATH = os.path.join(BASE_DIR, MEDIA_ROOT)

【讨论】:

以上是关于Django rest 框架 - 将图像上传到 Azure 存储的主要内容,如果未能解决你的问题,请参考以下文章

Django REST:上传和序列化多个图像

在Django rest框架中获取图像文件和字段

即使在创建帖子期间使用 Postman 将文件上传到该字段后,Django Rest Framework 仍显示字段错误

python Django Rest Framework - 图像/文件上传测试

如何使用 DJango Rest Framework 上传多个图像?

Django Rest 框架文件上传