Soy nuevo en FASTAPI y python. Necesito obtener todas las rutas en mi ruta raíz y mostrárselas al usuario. Sin embargo, no pude encontrar una manera de obtener todas las rutas recursivamente. La API está versionada con la ayuda de VersionedFastAPI Y el código actual no proporciona la ruta dentro de la versión, solo devuelve los genéricos. Código:
app = FastAPI() router = APIRouter( tags=["utilities"] ) @router.get("/") def read_root(request: Request): url_list = [ route.path for route in request.app.routes ] return { "endpoints": set(url_list) } @app.get('/foo') @version(1) def foo(): return "foo V1" @app.get('/foo') @version(2) def foo(): return "foo V2" app = VersionedFastAPI(app, enable_latest=True, version_format='{major}', prefix_format='/v{major}') app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"] ) app.include_router(router) Código para obtener la lista de rutas que se encuentra en \ ruta
url_list = [ route.path for route in request.app.routes ] return { "endpoints": set(url_list) } Esto devuelve solo ["/v1/openapi.json","/v2/docs","/openapi.json","/v2/openapi.json","/v2","/","/redoc","/v1","/docs","/docs/oauth2-redirect","/v1/docs","/latest"] Sin embargo, el punto final /foo se pierde aquí. Cualquier pista sobre esto ayudará.
Úselo como se muestra a continuación. Asegúrese de llamar a get_routes() antes de pasar la instancia de FastAPI a VersionedFastAPI. Además, en el siguiente ejemplo, hay un punto final (es decir, /greet ) sin versión. Por lo tanto, para asegurarse de que dichos puntos finales, si se encuentran en la API, se les asignará una versión, defina un valor predeterminado (también podría ser la última versión) cuando intente obtener la versión del punto final en version = getattr(route.endpoint, "_api_version", (2, 0)) . Al acceder a la documentación de la API en http://127.0.0.1:8000/v1/docs y http://127.0.0.1:8000/v2/docs , notará que /greet aparece en ambas versiones de la API; por lo tanto, se puede acceder a él usando /v1/greet o /v2/greet . Eso es porque inicialmente no se le había dado ninguna versión específica; sin embargo, al usar cualquiera de los dos anteriores, las solicitudes se enviarán a la misma función de ruta.
from fastapi import FastAPI, APIRouter from fastapi_versioning import VersionedFastAPI, version import uvicorn app = FastAPI() router = APIRouter() all_routes =[] def get_routes(): reserved_routes = ["/openapi.json", "/docs", "/docs/oauth2-redirect", "/redoc"] for route in app.routes: if route.path not in reserved_routes: if route.name is not None: version = getattr(route.endpoint, "_api_version", (2, 0)) all_routes.append("/v" + str(version[0]) + route.path) @router.get("/") def index(): return { "endpoints": all_routes } @app.get("/foo") @version(1) def foo(): return "foo v1" @app.get("/foo") @version(2) def foo(): return "foo v2" @app.get("/items/{item_id}") @version(2) def get_item(item_id: int): return item_id @app.get("/greet") def greet_with_hi(): return "Hi" get_routes() app = VersionedFastAPI(app, version_format='{major}',prefix_format='/v{major}') app.include_router(router) if __name__ == '__main__': uvicorn.run(app, host='127.0.0.1', port=8000)Salida (al acceder a http://127.0.0.1:8000/ ):
{"endpoints":["/v1/foo","/v2/foo","/v2/items/{item_id}","/v2/greet"]}