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/

Итак, моя догадка - одно из двух:

  1. Загрузка хранится неправильно, в одной папке, а не в подкаталогах по моделям

  2. Маршрутизация к этой "виртуальной" директории нарушена, поэтому она нарушается на этапе "проверки разрешений" (но я не смог понять, как работает маршрутизация в Django) и возвращает 404

    .
  3. Веб-сервер неправильно настроен, поэтому, хотя "виртуальный" URL в порядке, на самом деле URL файла нарушен, и ЭТО вызывает 404 (мой nginx содержит место /media/, но не место /documents/, как я ожидал)

    .
  4. Что-то совсем другое (следующим моим шагом будет перенос копии на мою собственную машину и проверка, будет ли проблема по-прежнему возникать)

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

Мой опыт связан с 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/

...
Вернуться на верх