Ошибка при загрузке файлов в хранилище Azure Blob через Django App
Мне нужно создать файловый менеджер для загрузки изображений из приложения Django в хранилище Azure blob. Однако, когда я пытаюсь загрузить файл в хранилище Azure, я получаю следующую ошибку:
Это мой azure_controller.py:
from io import BytesIO
import uuid
from pathlib import Path
from azure.identity import DefaultAzureCredential
from azure.keyvault.secrets import SecretClient
from azure.storage.blob import BlobClient
from django.conf import settings
from . import models
ALLOWED_EXTENSIONS = ['.png', '.jpg']
def create_blob_client(file_name):
default_credential = DefaultAzureCredential()
secret_client=SecretClient(
vault_url = settings.AZURE_VAULT_ACCOUNT,
credential = default_credential
)
storage_credentials = secret_client.get_secret(name=settings.AZURE_STORAGE_KEY_NAME)
return BlobClient(
account_url = settings.AZURE_STORAGE_ACCOUNT,
container_name = settings.AZURE_APP_BLOB_NAME,
blob_name = file_name,
credential = storage_credentials.value,
)
def check_file_ext(path):
ext = Path(path).suffix
return ext in ALLOWED_EXTENSIONS
def download_blob(file):
blob_client=create_blob_client(file)
if not blob_client.exists():
return
blob_content = blob_client.download_blob()
return blob_content
def save_file_url_to_db(file_url):
new_file = models.File.objects.create(file_url = file_url)
new_file.save()
return new_file
def upload_file_to_blob(file):
if not check_file_ext(file.name):
return
file_prefix = uuid.uuid4().hex
ext=Path(file.name).suffix
file_name = f"{file_prefix}{ext}"
file_content = file.read()
file_io = BytesIO(file_content)
blob_client =create_blob_client(file_name = file_name)
blob_client.upload_blob(data=file_io)
file_object=save_file_url_to_db(blob_client.url)
return file_object
Это мой settings.py:
Django settings for website project.
from pathlib import Path
import environ
BASE_DIR = Path(__file__).resolve().parent.parent
env = environ.Env()
environ.Env.read_env()
AZURE_STORAGE_ACCOUNT=env.str('AZURE_STORAGE_ACCOUNT')
AZURE_VAULT_ACCOUNT=env.str('AZURE_VAULT_ACCOUNT')
AZURE_STORAGE_KEY_NAME=env.str('AZURE_STORAGE_KEY_NAME')
AZURE_APP_BLOB_NAME=env.str('AZURE_APP_BLOB_NAME')
SECRET_KEY = env('MY_SECRET')
DEBUG = True
ALLOWED_HOSTS = []
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'files',
'django_extensions',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'website.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'website.wsgi.application'
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
# Password validation
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
STATIC_URL = 'static/'
# Default primary key field type
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
В некоторых документах, которые я читал, рекомендуется использовать Security Prncipal в Azure, что подразумевает настройку Azure AD, но каждый раз, когда я пытаюсь зайти в Azure AD в своей учетной записи, я получаю сообщение о том, что мне не разрешено (я являюсь владельцем учетной записи). Честно говоря, я понятия не имею, куда двигаться дальше и как начать исправлять ситуацию. Может ли кто-нибудь помочь?
Любая помощь будет высоко оценена