Django продолжает использовать неправильный сервер хранения при попытке загрузить статические файлы на S3

Обновление: ошибка была вызвана не django-storages, а django-heroku

Похоже, что django-heroku переопределяет некоторые переменные, вызвавшие такое поведение. Смотрите мой ответ ниже.


Я использую S3 в качестве службы хранения для других приложений Django, однако для нового проекта Django отказывается выбирать правильный сервер и продолжает помещать файлы в мою локальную файловую систему вместо загрузки.

Точнее, после того, как я установил boto3 и настроил settings.py, а затем запустил python manage.py collectstatic, эта команда продолжает перемещать статические файлы в <my_project_path>/staticfiles вместо того, чтобы начинать загрузку на S3.

Это вывод python manage.py collectstatic:

You have requested to collect static files at the destination
location as specified in your settings:

    <my_project_path>/staticfiles

This will overwrite existing files!
Are you sure you want to do this?

Type 'yes' to continue, or 'no' to cancel:

Мои настройки:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.sites',

    # Vendor
    'storages',
    'allauth',
    'allauth.account',
    'allauth.socialaccount',
    'sass_processor',
    'crispy_forms',

    [..]
]

# static & media files
USE_S3 = config('USE_S3', cast=bool, default=True)

AWS_ACCESS_KEY_ID = config('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = config('AWS_SECRET_ACCESS_KEY')
AWS_DEFAULT_ACL = None
AWS_STORAGE_BUCKET_NAME = config('AWS_STORAGE_BUCKET')
AWS_S3_CUSTOM_DOMAIN = '%s.s3.amazonaws.com' % AWS_STORAGE_BUCKET_NAME
AWS_S3_OBJECT_PARAMETERS = {
    'CacheControl': 'max-age=86400',
}
AWS_LOCATION = 'static'

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

if USE_S3:
    MEDIA_URL = 'https://%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, 'media')
    DEFAULT_FILE_STORAGE = '<my_app>.storage_backends.MediaStorage'
    STATIC_URL = 'https://%s/%s/' % (AWS_S3_CUSTOM_DOMAIN, AWS_LOCATION)
    STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

else:
    MEDIA_URL = '/media/'
    STATIC_URL = '/static/'
    STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)
STATICFILES_FINDERS = [
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    'sass_processor.finders.CssFinder',
]

Мои требования.txt:

...
boto3==1.11.12
botocore==1.14.15
django-storages==1.9.1
jmespath==0.9.4
s3transfer==0.3.3
...

Пробовал копировать настройки из другого проекта, где работает загрузка, перепроверил документы django-storages, даже установил точные версии boto3 и т. д., чтобы исключить ошибку из-за более новой версии, проверил свой settings.py, если где-то забыл конфликтную настройку, но я просто не могу понять, почему Django даже не пытается загрузить.

Любые указатели очень ценятся!


person Simon    schedule 09.04.2020    source источник
comment
Я видел этот пост, поможет ли он вам понять stackoverflow.com/questions/42462880/   -  person Harsh Nagarkar    schedule 09.04.2020
comment
@HarshNagarkar нет, к сожалению, это не связано с моей проблемой   -  person Simon    schedule 09.04.2020


Ответы (1)


После дальнейших копаний я нашел виновника. Оказывается, нежелательное поведение вызвал пакет django-heroku.

Пакет автоматически устанавливает STATIC_ROOT='/static/', переопределяя местоположение AWS в файле settings.py.

Вы можете отключить это поведение, установив staticfiles=False при настройке django-heroku следующим образом:

import django_heroku
django_heroku.settings(locals(), staticfiles=False)

Я также понял, что в других приложениях, в которых S3 успешно работал, я даже не использовал django-heroku, что вызвало мое замешательство и было единственным отличием в настройке, которое я пропустил в своих предыдущих проверках.

person Simon    schedule 09.04.2020