Supongamos que tengo un proyecto FastAPI que contiene más de 100 puntos finales de API. ¿Cómo puedo enumerar todas las API/rutas?
Para obtener todos los patrones de URL posibles, necesitamos obtener acceso a las rutas de URL definidas, que es un atributo de la ejecución de la instancia de la aplicación.
Podemos hacer eso al menos de dos maneras,
FastAPI : esto es útil cuando tiene acceso a la instancia de FastAPIRequest : esto es útil cuando tiene acceso a las solicitudes entrantes, pero no a la instancia de FastAPI. from fastapi import FastAPI, Request app = FastAPI() @app.get(path="/", name="API Foo") def foo(): return {"message": "this is API Foo"} @app.post(path="/bar", name="API Bar") def bar(): return {"message": "this is API Bar"} # Using FastAPI instance @app.get("/url-list") def get_all_urls(): url_list = [{"path": route.path, "name": route.name} for route in app.routes] return url_list # Using Request instance @app.get("/url-list-from-request") def get_all_urls_from_request(request: Request): url_list = [ {"path": route.path, "name": route.name} for route in request.app.routes ] return url_listTraté de proporcionar una edición de la respuesta original, pero no me dejó.
Otro caso de uso: suponga que no está en el archivo de la aplicación principal y no tiene acceso a la app en el espacio de nombres. En ese caso, la documentación de Starlette dice que también tenemos acceso a la instancia de la aplicación desde la solicitud como request.app . Por ejemplo, si en el archivo principal solo tiene la instancia de la aplicación y no desea tener ningún punto final en el archivo principal, sino que todos estén en enrutadores separados.
from fastapi import FastAPI # then let's import all the various routers we have # please note that api is the name of our package from api.routers import router_1, router_2, router_3, utils app = FastAPI() app.include_router(router_1) app.include_router(router_2) app.include_router(router_3) app.include_router(utils)Tengo mi punto final list_endpoints en el enrutador utils. Para poder enumerar todas las rutas de la aplicación, haría lo siguiente:
utils.py from fastapi import APIRouter, Request router = APIRouter( prefix="/utils", tags=["utilities"] ) @router.get('/list_endpoints/') def list_endpoints(request: Request): url_list = [ {'path': route.path, 'name': route.name} for route in request.app.routes ] return url_list Tenga en cuenta que en lugar de usar app.routes , usé request.app.routes y tengo acceso a todos ellos. Si ahora accede a /utils/list_endpoints obtendrá todas sus rutas.