Django default_storage не может найти существующий файл
Я настраиваю работу с моим приложением django, но столкнулся с проблемой при проверке наличия какого-либо файла в хранилище S3.
Я не могу понять, почему я не могу использовать метод exists() в своем коде. Я долго искал ошибку, но оказалось, что метод exists() всегда возвращает мне значение False.
Вот пример:
>>> from django.core.files.storage import default_storage
>>> print(default_storage.listdir(""))
(['media', 'preview'], ['address_preview_1.png','address_preview_35.jpg'])
>>>
>>> print(default_storage.listdir("media"))
([], ['address_preview_35.jpg'])
>>> print(default_storage.exists('address_preview_35.jpg'))
False
>>> print(default_storage.exists('/media/address_preview_35.jpg'))
False
>>> print(default_storage.exists('media/address_preview_35.jpg'))
False
>>> print(default_storage.location)
media
Мы видим, что файл "address_preview_35.jpg " есть как в корневом каталоге репозитория, так и в папке "media".
Все аргументы в settings.py настроены так, как описано в документации. Файлы изображений определенно находятся на сервере. Мы можем открыть его. Мы можем получить изображение по полной ссылке. Мы можем загружать новые файлы на сервер и удалять старые. Мы можем делать все, кроме проверки того, есть ли файл на сервере или нет. Что я делаю не так!?
Я попытался получить доступ к серверу напрямую и через s3cmd. Я попытался получить доступ к хранилищу в модуле через
from storages.backends.s3boto3 import S3Boto3Storage
s3_storage = S3Boto3Storage()
print(s3_storage.exists("media/address_preview_35.jpg"))
результат тот же - я вижу файл в списке, но при проверке exists() получаю значение False.
чтобы включить необходимые разрешения для корзины S3 для проверки существования файла с помощью exists()
, выполните следующие действия:
Перейдите в консоль aws iam:
нажмите "пользователи" на боковой панели
выберите пользователя iam, связанного с приложением django
перейдите на вкладку разрешения
нажмите кнопку добавить разрешения, затем прикрепите политики
Прикрепить AmazonS3ReadOnlyAccess политика только для чтения
найдите доступ к Amazon S3 только для чтения.
прикрепите его, чтобы предоставить разрешения на чтение для всех S3 objects.cl
нажмите прикрепить политику
Если у вас уже есть разрешение, вам может потребоваться понизить django-хранилища[boto3] проверьте здесь