Давно была похожая проблема, на stackoverflow нашел решение, что нужно раздачу статики и апи делать отдельно.
Вот пример, из моего кода. Здесь без jinja2, но суть та же
app = FastAPI()
app_api = FastAPI()
app.mount("/api", app_api)
app.mount("/", StaticFiles(directory="static", html=True), name="static")
@app.get('/', response_class=HTMLResponse)
async def main_page():
return HTMLResponse('index.html')
@app_api.post('/login', response_class=JSONResponse)
async def login(
username: str = Body(...),
password: str = Body(...)
):
...