fastapi: не выводится изображение в html-шаблоне
Пробую вывести картинку в html-шаблоне сайта, но скрипт не находит ее. В чём может быть проблема?
Код:
from fastapi import FastAPI, Request, HTTPException
from uvicorn import run
from fastapi.staticfiles import StaticFiles
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
app = FastAPI()
templates = Jinja2Templates(directory="templates")
@app.get("/", response_class=HTMLResponse)
async def root(request: Request):
try:
return templates.TemplateResponse("main.html", {"request": request})
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
if __name__ == "__main__":
run("main:app", host="localhost", port=8000, reload=True)
template:
<!DOCTYPE html>
<html>
<head>
<title>Поле ввода с начальным текстом</title>
<img src='logo.png'>
</head>
</html>
картинка в той же папке, что и html-файл (в папке templates)
Ответы (2 шт):
Автор решения: TFader
→ Ссылка
проблема была в том, что я не прописал статичный путь в основном файле. выглядит это вот так:
app.mount("/static", StaticFiles(directory="static"), name="static")
далее кидаете картинку в папку static и указываете в вашем html файле путь
static/...
Автор решения: Дмитрий Губин
→ Ссылка
Я нашел решение для варианта, когда изображения хочется хранить не в templates и не в static. Я как не пробовал добавить изображение, не хотел грузить неоткуда, кроме "static", а назначить свою папку как StaticFiles у меня не вышло. Я решил, сделав свой эндпоинт для загрузки:
@router.get("/get-media/{path:path}")
async def get_media(path: str):
full_path = MEDIA_DIR / path
if full_path.exists():
return FileResponse(full_path)
return Response(status_code=404)
и затем я получаю изображение как:
<img src="{{ url_for('get_media', path='Testuser/DevM_B_tstimg_noise.jpg') }}">
или:
mapImg.src = `/get-media/${mapObj.result}`;