Задать вопрос
mal1kov
@mal1kov
Притворись дураком 5 минут, чем быть им всю жизнь.

Как прикрутить файловое хранилище S3 (Selectel) на django-filebrowser?

Я установил django-filebrowser-no-grappelli, так как зависимость к на стандартной библиотеке django-grappelli конфликтует с django-tinymce.

На моем проекте при запуске django сервера на DEBUG=False автоматически сервер переключается на storage от Selectel. При дебаге все работает отлично, никаках ошибок нету, но после его отключения filebrowser не хочет работать со storage, выдает ошибку 500.

кусок settings.py

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static_files')
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'news/static'),
                    os.path.join(BASE_DIR, 'konkurs/static')]

if config.app.debug:
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
    MEDIA_URL = '/media/'
else:
    if config.app.whitenoise:
        STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
    else:
        STATICFILES_STORAGE = 'django_selectel_storage.storage.SelectelStorage'

    DEFAULT_FILE_STORAGE = 'django_selectel_storage.storage.SelectelStorage'

    if 'filebrowser' in INSTALLED_APPS:
        fb_sel_st = 'news.services.custom_storage_for_filebrowser.SelectelStorageForFileBrowser' # здесь я после первой ошибки написал класс который наследует от S3BotoStorageMixin и SelectelStorage
        STATICFILES_STORAGE = fb_sel_st
        DEFAULT_FILE_STORAGE = fb_sel_st

    SELECTEL_STORAGES = {
        'default': {
            'USERNAME': config.selectel.user,
            'PASSWORD': config.selectel.password,
            'CONTAINER': config.selectel.container,
            'CUSTOM_DOMAIN': config.selectel.custom_domain if config.selectel.custom_domain else False,
        },
    }



Первый раз я получил ошибку:
'SelectelStorage' object has no attribute 'isdir'

Затем я написал класс по рекомендациям на гитхабе:
from django_selectel_storage.storage import SelectelStorage
from filebrowser_safe.storage import S3BotoStorageMixin, clean_name

class SelectelStorageForFileBrowser(S3BotoStorageMixin, SelectelStorage):
    pass


У некоторых этот код решило проблему, но у меня появились ошибки за ошибкой:
'SelectelStorageForFileBrowser' object has no attribute '_normalize_name'

'SelectelStorageForFileBrowser' object has no attribute '_clean_name'

'SelectelStorageForFileBrowser' object has no attribute 'bucket'


И в итоге мой класс стал таким...

from django_selectel_storage.storage import SelectelStorage
from filebrowser_safe.storage import S3BotoStorageMixin, clean_name


class SelectelStorageForFileBrowser(S3BotoStorageMixin, SelectelStorage):
    def _clean_name(self, name):
        """
        Cleans the name so that Windows style paths work
        """
        return clean_name(name)

    def _normalize_name(self, name):
        pass

    def isdir(self, name):
        # That's some inefficient implementation...
        # If there are some files having 'name' as their prefix, then
        # the name is considered to be a directory
        if not name:  # Empty name is a directory
            return True

        if self.isfile(name):
            return False

        name = self._normalize_name(self._clean_name(name))
        dirlist = self.bucket.list(self._encode_name(name))

        # Check whether the iterator is empty
        for item in dirlist:
            return True
        return False



Дальше этой ошибки я устал копаться.
'SelectelStorageForFileBrowser' object has no attribute 'bucket'


В официальном репозитории я так понял django-filebrowser не поддерживает S3 до сих пор.
  • Вопрос задан
  • 356 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы