mirror of
https://gitverse.ru/kpa39l/vesti.git
synced 2026-09-29 09:55:03 +00:00
28 lines
1.9 KiB
Markdown
28 lines
1.9 KiB
Markdown
## Why
|
||
|
||
Пользователь не видит, что за картинка приложена к новости в карточке кандидата:
|
||
в шаблоне `candidates.html` для постов с `media_path` показывается только бейдж
|
||
«🖼 медиа», а само изображение не отображается. В `web/app.py` нет роута, который
|
||
отдаёт медиа-файл (есть только /static для bootstrap), поэтому `<img>` некуда указывать.
|
||
Аналогично в `published.html` медиа не показывается.
|
||
|
||
## What Changes
|
||
|
||
- Добавить в `web/app.py` роут `GET /media/{filename}` (с авторизацией, как у других
|
||
роутов), который отдаёт файл из `/opt/vesti/media/` или `/opt/vesti/media/media/`
|
||
(исторический баг путей: у старых постов media_path = `media/media/<file>`).
|
||
Безопасно: только basename (защита от path traversal), отдаём FileResponse.
|
||
- В `candidates.html` и `published.html` для постов с `media_path` выводить
|
||
`<img src="/media/{{ basename(media_path) }}" class="img-fluid ...">`
|
||
(направление на роут; если файла нет — не показывать/плейсхолдер).
|
||
- Медиа в карточке: фото/видео. Для изображений — `<img>`, для видео — `<video controls>`.
|
||
|
||
## Why Not
|
||
|
||
- Отдавать медиа через /static нельзя: файлы вне static/ и большие; роут нужен именно
|
||
для media/.
|
||
|
||
## Open Questions
|
||
|
||
- Путь `media_path` в БД: `media/<file>` или `media/media/<file>` — резолвить через
|
||
basename (имя файла уникально в каталоге). |