Wagtail {{document.url}} возвращает 404 для загруженных пользователем файлов, в производстве
Я унаследовал проект Wagtail CMS, но не смог решить проблему, связанную с загрузкой документов.
Загрузив файл через CMS, он попадает в каталог документов /var/www/example.com/wagtail/media/documents/test_pdf.pdf, который соответствует каталогу /usr/src/app/media/documents/test_pdf.pdf внутри контейнера docker.
В передней части (и в приборной панели Wagtail) document.url разрешается в https://example.com/documents/9/test_pdf.pdf/, который возвращает 404. Очевидно, что в приведенном выше пути к файлу отсутствует сегмент номера модели, но я читал на форуме , что
В Wagtail документы всегда обслуживаются через представление Django (wagtail.wagtaildocs.views.serve.serve), чтобы мы могли выполнять дополнительную обработку при загрузке документов
.
так что, возможно, это само по себе не является проблемой.
В файле urls.py есть пара строк, которые выглядят корректно:
urlpatterns = [
url(r'^django-admin/', admin.site.urls),
url(r'^admin/', include(wagtailadmin_urls)),
url(r'^documents/', include(wagtaildocs_urls)),
url(r'^search/$', search_views.search, name='search'),
url(r'^sitemap\.xml$', sitemap),
url(r'', include(wagtail_urls)),
# url(r'^pages/', include(wagtail_urls)),
]
if settings.DEBUG:
...
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
и в base.py
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/
Итак, моя догадка - одно из двух:
Загрузка хранится неправильно, в одной папке, а не в подкаталогах по моделям
Маршрутизация к этой "виртуальной" директории нарушена, поэтому она нарушается на этапе "проверки разрешений" (но я не смог понять, как работает маршрутизация в Django) и возвращает 404
.Веб-сервер неправильно настроен, поэтому, хотя "виртуальный" URL в порядке, на самом деле URL файла нарушен, и ЭТО вызывает 404 (мой nginx содержит место /media/, но не место /documents/, как я ожидал)
.Что-то совсем другое (следующим моим шагом будет перенос копии на мою собственную машину и проверка, будет ли проблема по-прежнему возникать)
Я понимаю, что здесь не так много, но я надеюсь, что кто-нибудь сможет подсказать мне, что еще я должен проверить, так как я бился головой об это большую часть дня.
Мой опыт связан с Ruby on Rails, поэтому, как и в случае с этим фреймворком, у меня есть ощущение, что за кадром происходит много "магии", из-за которой очень сложно понять, что происходит.
Спасибо!
Вы можете просматривать документы во время разработки благодаря
if settings.DEBUG:
...
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Как и static файлы media должны обрабатываться на уровне сервера. Например, если вы используете GCP, вам нужно обновить app.yaml и добавить media/ таким же образом, как и static/
...
handlers:
- url: /static
static_dir: static/
- url: /media
static_dir: media/
...