Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

1.5K
Views
Cómo servir archivos estáticos en FastAPI

Estoy tratando de servir archivos estáticos que tengo en un directorio package_docs. Cuando abro en el navegador:

http://127.0.0.1:8001/packages/docs/index.html , la página se está ejecutando.

Pero quiero abrir la página: http://127.0.0.1:8001/packages/docs/

sin el archivo fuente. Y la salida es 404 Not Found

 app.mount("/packages/docs", StaticFiles(directory=pkg_resources.resource_filename(__name__, 'package_docs') ), name="package_docs") @app.get("/packages/docs/.*", include_in_schema=False) def root(): return HTMLResponse(pkg_resources.resource_string(__name__, "package_docs/index.html")) app.include_router(static.router) app.include_router(jamcam.router, prefix="/api/v1/cams", tags=["jamcam"])

¿Cómo puedo cambiar mi código? Cualquier consejo será útil. Gracias de antemano.

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

Hay una opción html en Starlette que se puede usar dentro de FastAPI. Documentación Starlette

Esto te permitiría tener algo como:

 app.mount("/site", StaticFiles(directory="site", html = True), name="site")

Que analizaría /site a /site/index.html, /site/foo/ a /site/foo/index.html, etc.

Las otras respuestas pueden ayudarlo a redirigir si desea cambiar los nombres de las carpetas de una manera que no se maneja usando "directory = /foo", pero esta es la opción más simple si simplemente desea cargar los archivos .html asociados.

over 4 years ago · Santiago Trujillo Report

0

Debe usar TemplateResponse de FastAPI (en realidad, Starlette):

 from fastapi import Request from fastapi.staticfiles import StaticFiles from fastapi.templating import Jinja2Templates app.mount("/static", StaticFiles(directory="static"), name="static") templates = Jinja2Templates(directory="package_docs") @app.get("/items/{id}") async def example(request: Request): return templates.TemplateResponse("index.html", {"request": request})

Request como parte de los pares clave-valor en el contexto de Jinja2. Por lo tanto, también debe declararlo como parámetro de consulta. y debe especificar un archivo html que desea procesar con Jinja ("your.html", {"request": request})

También para devolver una HTMLResponse directamente, puede usar HTMLResponse de fastapi.responses

 from fastapi.responses import HTMLResponse @app.get("/items/", response_class=HTMLResponse) async def read_items(): return """ <html> <head> <title></title> </head> <body> </body> </html> """

Puede leer más sobre la respuesta personalizada de Respuestas personalizadas de FastAPI

over 4 years ago · Santiago Trujillo Report

0

de los documentos

El primer "/static" se refiere a la subruta en la que se "montará" esta "subaplicación". Por lo tanto, cualquier ruta que comience con "/static" será manejada por él.

Esto significa que monta su directorio en http://127.0.0.1:8001/packages/docs/ , pero luego debe especificar un archivo en la URL o agregar un controlador como lo hizo. Sin embargo, el problema es que, dado que montó la ruta primero, no tendrá en cuenta las siguientes rutas que incluyen parte de la ruta.

Una posibilidad es especificar primero la ruta para http://127.0.0.1:8001/packages/docs/ para que sea manejado por fastapi y luego montar la carpeta, sirviendo archivos estáticos.

Además, redirigiría a los usuarios que soliciten http://127.0.0.1:8001/packages/docs/ a http://127.0.0.1:8001/packages/docs/index.html

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!