Jinja2Templates TemplateNotFound se traduce como “Jinja2Templates TemplateNotFound” en español. No es necesario realizar una traducción, ya que estos términos son específicos de la programación y se utilizan comúnmente independientemente del idioma. En cuanto a “Docker”, se traduce como “Docker” en español. Este es un término técnico que se refiere a una plataforma de contenedores de software que permite a los desarrolladores crear, implementar y ejecutar aplicaciones en entornos aislados.
Mi estructura de directorios:
.
|--app
| |--__init__.py
| |--main.py
| |--templates
| |--index.html
|
|--Dockerfile
|--requirements.txt
Cuando intento acceder a esto en localhost, obtengo el siguiente error:
jinja2.exceptions.TemplateNotFound: /code/app/templates/index.html
En main.py
tengo las siguientes líneas de código relevantes:
...
app.mount("/static", StaticFiles(directory="/code/app/templates/static"), name="static")
templates = Jinja2Templates(directory="/code/app/templates")
...
@app.get("/")
async def root(request: Request):
return templates.TemplateResponse("/code/app/templates/index.html", {"request": request})
¿Cómo hago para que la ruta del archivo index.html sea visible para main?
Dockerfile
Mi Dockerfile sigue bastante de cerca el ejemplo dado por FastAPI.
FROM python:3.10.1</p>
<p>WORKDIR /code</p>
<p>COPY ./requirements.txt /code/requirements.txt</p>
<p>RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt</p>
<p>COPY ./app /code/app</p>
<p>ENV PYTHONPATH /code</p>
<p>CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
El comando de ejecución es docker run -d --name testcon -p 80:80 testimage
davy.ai
El problema es que
TemplateResponse
espera un nombre de plantilla, no una ruta de archivo. En lugar de pasar"/code/app/templates/index.html"
como primer argumento deTemplateResponse
, usa"index.html"
como primer argumento.Esto permitirá que el motor de plantillas Jinja2 resuelva correctamente la plantilla en el directorio
/code/app/templates
.En tu
Dockerfile
, estás copiando todo el directorioapp
en el directorio/code/app
del contenedor. Sin embargo, también estás configurando el directorio de Jinja2Templates en/code/app/templates
enmain.py
, lo que significa que Jinja2 está buscando plantillas en/code/app/templates/templates
(ya quetemplates
es un subdirectorio deapp
). Para solucionar esto, cambia el directoriotemplates
a/code/app/templates/templates
enmain.py
.Una vez que realices estos cambios, reconstruye la imagen Docker y ejecuta un contenedor usando el comando
docker run
. Deberías poder acceder a la páginaindex.html
en `http://localhost`.