Статические файлы не сохраняются в корзине S3 с использованием cookiecutter-django

Я пытаюсь развернуть свой проект на Heroku. Я запустил heroku run python3 manage.py collectstatic после его развертывания.

У меня это на config/base.py

STATIC_ROOT = str(ROOT_DIR("staticfiles"))
STATIC_URL = "/static/"
STATICFILES_DIRS = [str(APPS_DIR.path("static"))]
STATICFILES_FINDERS = [
    "django.contrib.staticfiles.finders.FileSystemFinder",
    "django.contrib.staticfiles.finders.AppDirectoriesFinder",
]

Это на config/production.py

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
INSTALLED_APPS += ["storages"]  # noqa F405
AWS_ACCESS_KEY_ID = env("DJANGO_AWS_ACCESS_KEY_ID")
AWS_SECRET_ACCESS_KEY = env("DJANGO_AWS_SECRET_ACCESS_KEY")
AWS_STORAGE_BUCKET_NAME = env("DJANGO_AWS_STORAGE_BUCKET_NAME")
AWS_QUERYSTRING_AUTH = False
_AWS_EXPIRY = 60 * 60 * 24 * 7
AWS_S3_OBJECT_PARAMETERS = {
"CacheControl": f"max-age={_AWS_EXPIRY}, s-maxage={_AWS_EXPIRY}, must-revalidate"
}
AWS_DEFAULT_ACL = None
AWS_S3_REGION_NAME = env("DJANGO_AWS_S3_REGION_NAME", default=None)
STATICFILES_STORAGE = "whitenoise.storage.CompressedManifestStaticFilesStorage"

from storages.backends.s3boto3 import S3Boto3Storage  # noqa E402


class StaticRootS3Boto3Storage(S3Boto3Storage):
    location = "static"
    default_acl = "public-read"


class MediaRootS3Boto3Storage(S3Boto3Storage):
    location = "media"
    file_overwrite = False

DEFAULT_FILE_STORAGE = "config.settings.production.MediaRootS3Boto3Storage"
MEDIA_URL = f"https://{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com/media/"

Это мои переменные env heroku введите здесь описание изображения

Я создал это, используя cookiecutter-django. На моем локальном хосте все работает нормально, но когда я развертываю его на героку, он не сохраняет статические файлы.


person highcenbug    schedule 18.11.2019    source источник


Ответы (1)


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

Установите whitenoise с помощью pip install. pip install whitenoise.

Вам нужно будет включить whitenoise в качестве промежуточного программного обеспечения.

MIDDLEWARE = [
  'django.middleware.security.SecurityMiddleware',
  'whitenoise.middleware.WhiteNoiseMiddleware',
  # ...
]

Использовать белый шум в режиме разработки. Вам нужно установленное приложение.

INSTALLED_APPS = [
    'whitenoise.runserver_nostatic',
    'django.contrib.staticfiles',
    # ...
]

Вот об этом! Подробнее можно прочитать в документации. http://whitenoise.evans.io/en/stable/django.html

Для большей производительности вы можете настроить его на использование CDN, но если это всего лишь небольшой сайт, в этом нет необходимости.

person Jonathan    schedule 18.11.2019
comment
Вам не нужны оба. Так что нет причин иметь и то, и другое. - person Jonathan; 18.11.2019
comment
Я думаю, что @Jonathan прав: для производства вам просто нужно промежуточное программное обеспечение, а для разработки вам нужно добавить приложение whitenoise.runserver_nostatic. - person cjauvin; 21.10.2020