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.
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.
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
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