Я установил 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 до сих пор.