У меня есть сайт Wagtail CMS (работает 1.13.1). Он находится на двух серверах за балансировщиком нагрузки и использует S3 для статических и мультимедийных ресурсов, которым управляет Django Storages.
Когда я добавляю документ на страницу в CMS, документ загружается в S3, но ни администратор, ни шаблон не могут найти документ и возвращают сообщение об ошибке:
ClientError: An error occurred (404) when calling the HeadObject operation: Not Found
В шаблоне я помещаю URL-адрес документа с использованием {{ item.url } (если я использую item.file.url, он отлично работает, потому что использует URL-адрес CDN).
В разделе «документы» администратора CMS появляется сообщение об ошибке: «Не удалось найти файл. Измените источник или удалите документ».
Я очень озадачен этим. Что еще хуже, это в конечном итоге обнаруживается.
Документ доступен как по URL-адресу S3, так и по URL-адресу CloudFront, но трясогузка использует свой собственный URL-адрес. то есть: https://mywebsite.com/documents/20/mypdffile.pdf, а не https: //cloudfront.url/media/documents/mypdffile.pdf
Основные моменты файла конфигурации включают:
STATIC_URL = 'https://cloudfront.url/static/'
STATICFILES_LOCATION = 'static'
STATICFILES_STORAGE = 'project.custom_storages.StaticStorage'
MEDIA_URL = 'https://cloudfront.url/media/'
MEDIAFILES_LOCATION = 'media'
DEFAULT_FILE_STORAGE = 'project.custom_storages.MediaStorage'
AWS_STORAGE_BUCKET_NAME = 's3bucket.url'
AWS_S3_REGION_NAME = 'ap-southeast-2'
AWS_ACCESS_KEY_ID = 'ACCESS KEY'
AWS_SECRET_ACCESS_KEY = 'SECRET ACCESS KEY'
AWS_S3_SECURE_URLS = True
AWS_IS_GZIPPED = True
AWS_S3_OBJECT_PARAMETERS = {
'CacheControl': 'max-age=2592000',
}
AWS_S3_CUSTOM_DOMAIN = 'https://cloudfront.url/'
AWS_PRELOAD_METADATA = True
В моем «глобальном» файле urls.py у меня есть:
urlpatterns = [
url(r'', include(wagtail_urls)),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Как я уже сказал, статические файлы и не-документы выглядят нормально.
@allcaps - Я идиот, вы абсолютно правы, только наоборот, я не должен был добавлять последний, потому что он не в режиме отладки. Не стесняйтесь превратить его в ответ, и я отмечу его как правильный.





+ static ... предназначен только для сервера разработки.
См. документы:
This helper function works only in debug mode and only if the given prefix is local (e.g. /media/) and not a URL (e.g. media.example.com).
Вы можете сделать такие URL-адреса разработки явно условными, заключив их в оператор if settings.DEBUG. Например:
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Про s3 ничего не знаю. Я знаю, что
+ static ...предназначен только для сервера разработки. См .: docs.djangoproject.com/en/2.0/howto/static-files/… Эта вспомогательная функция работает только в режиме отладки и только в том случае, если данный префикс является локальным (например, / media /), а не URL-адресом (например, media.example.com). Вы в режиме отладки? У вас должен бытьDEBUG = False. Решает ли это вашу проблему? Я счастлив превратить этот комментарий в ответ.