Ошибка недопустимой операции при загрузке файла DJango

У меня есть API, основанный на Django REST, работающий корректно через Azure Web Service, но он не работает при попытке загрузить файл в монтируемый том контейнера. Я выполняю процесс загрузки с помощью POST-запроса, и в моем локальном окружении он работает без проблем.

Модель, которую я использовал для загрузки файла в БД, выглядит следующим образом:

from app.controllers.users.models import User


class QueueJob(models.Model):

    class Tasks(models.TextChoices):
        COLLABORATORS_UPDATE = 'CB_UPDATE'
        WITHDRAWALS_UPDATE = 'WD_UPDATE'
        EXPATS_UPDATE = 'EP_UPDATE'

    class Statuses(models.TextChoices):
        PENDING = 'PENDING'
        PROCESSING = 'PROCESSING'
        DONE = 'DONE'
        FAILED = 'FAILED'

    user = models.ForeignKey(User, on_delete=models.CASCADE)
    task = models.CharField(max_length=20, choices=Tasks.choices, blank=False, null=False)
    file = models.FileField(upload_to=r'reports/', null=False)
    extra_data = models.CharField(max_length=1024, blank=False, null=True)
    execution_comment = models.CharField(max_length=255, blank=False, null=True)
    status = models.CharField(max_length=20, choices=Statuses.choices, null=False, default=Statuses.PENDING)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name = 'Queue Job'
        verbose_name_plural = 'Queue Jobs'
        ordering = ['created_at']


class QueueJobSerializer(ModelSerializer):
    class Meta:
        model = QueueJob
        exclude = ['id', ]

Странно то, что файл действительно загружается, и я могу получить к нему доступ через том. как вы можете видеть здесь но все равно происходит сбой при выполнении метода save() при создании записи в DB с сериализатором, возвращающим следующую ошибку:

[Errno 1] Операция не разрешена: '/app/storage/public/reports/report_UhrYWD6.xlsb'

>

Я пробовал установить django-storages для azure, но мы не используем Storage Account, только монтирование тома, и все равно не получилось.

Надеюсь, кто-нибудь сможет мне помочь

Спасибо Эллиоту Кастильо и Памеле Пенг. Размещаем ваши предложения в качестве ответа, чтобы помочь другим членам сообщества.

Внесите изменения в свой settings.py в соответствии с приведенным ниже описанием:

mysite/settings.py

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, '<directory that houses the static files>/static'),
]

AZURE_ACCOUNT_NAME = '<azure container name>'
AZURE_ACCOUNT_KEY = '<azure account key for this container>'
AZURE_CUSTOM_DOMAIN = f'{AZURE_ACCOUNT_NAME}.blob.core.windows.net'
AZURE_LOCATION = '<blob container name>'
AZURE_CONTAINER = '<blob container name>'

STATIC_LOCATION = 'static'
STATIC_URL = f'https://{AZURE_CUSTOM_DOMAIN}/{STATIC_LOCATION}/'

STATICFILES_STORAGE = 'storages.backends.azure_storage.AzureStorage'
DEFAULT_FILE_STORAGE = 'mysite.custom_azure.AzureMediaStorage'

Вы также можете попробовать использовать клиентскую библиотеку Azure Storage Blobs для Python:

from azure.storage.blob import BlobClient

blob = BlobClient.from_connection_string(conn_str="<connection_string>", container_name="my_container", blob_name="my_blob")

with open("file.csv", "rb") as data:
    blob.upload_blob(data)

Вы можете обратиться к Django Azure upload file to blob storage и django file upload is not working in azure blob with new version

Вернуться на верх