es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , , ,

Answer

  1. Avatar for 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 de TemplateResponse, usa "index.html" como primer argumento.

    ...
    @app.get("/")
    async def root(request: Request):
        return templates.TemplateResponse("index.html", {"request": request})
    

    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 directorio app en el directorio /code/app del contenedor. Sin embargo, también estás configurando el directorio de Jinja2Templates en /code/app/templates en main.py, lo que significa que Jinja2 está buscando plantillas en /code/app/templates/templates (ya que templates es un subdirectorio de app). Para solucionar esto, cambia el directorio templates a /code/app/templates/templates en main.py.

    ...
    app.mount("/static", StaticFiles(directory="/code/app/templates/static"), name="static")
    templates = Jinja2Templates(directory="/code/app/templates/templates")
    ...
    

    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ágina index.html en `http://localhost`.

Comments are closed.