Crie um templates que você possa reutilizar posteriormente.
Declare um parâmetro Request no path operation que retornará um template.
Use o template que você criou para renderizar e retornar uma TemplateResponse, passe o nome do template, o request object, e um "context" dict com pares chave-valor a serem usados dentro do template do Jinja2.
Antes do FastAPI 0.108.0, Starlette 0.29.0, name era o primeiro parâmetro.
Além disso, em versões anteriores, o objeto request era passado como parte dos pares chave-valor no "context" dict para o Jinja2.
Dica
Ao declarar response_class=HTMLResponse, a documentação entenderá que a resposta será HTML.
Detalhes Técnicos
Você também poderia usar from starlette.templating import Jinja2Templates.
FastAPI fornece o mesmo starlette.templating como fastapi.templating apenas como uma conveniência para você, o desenvolvedor. Mas a maioria das respostas disponíveis vêm diretamente do Starlette. O mesmo acontece com Request e StaticFiles.
Você também pode usar url_for() dentro do template, ele recebe como argumentos os mesmos argumentos que seriam usados pela sua path operation function.
Logo, a seção com:
<a href="{{url_for('read_item',id=id)}}">
...irá gerar um link para a mesma URL que será tratada pela path operation functionread_item(id=id).