Supongamos que tengo las siguientes vistas,
from fastapi import FastAPI app = FastAPI() @app.get('/hello/') def hello_world(): return {"msg": "Hello World"} @app.get('/hello/{number}/') def hello_world_number(number: int): return {"msg": "Hello World Number", "number": number}He estado usando estas funciones en Flask y Django.
Entonces, ¿cómo puedo obtener/construir las URL de hello_world y hello_world_number de manera similar?
Tenemos el método Router.url_path_for(...) que se encuentra dentro del paquete starlette
FastAPI Este método es útil cuando puede acceder a la instancia de FastAPI en su contexto actual. (Gracias a @Yagizcan Degirmenci )
from fastapi import FastAPI app = FastAPI() @app.get('/hello/') def hello_world(): return {"msg": "Hello World"} @app.get('/hello/{number}/') def hello_world_number(number: int): return {"msg": "Hello World Number", "number": number} print(app.url_path_for('hello_world')) print(app.url_path_for('hello_world_number', number=1)) print(app.url_path_for('hello_world_number', number=2)) # Results "/hello/" "/hello/1/" "/hello/2/"APIRouter , es posible que router.url_path_for('hello_world') no funcione, ya que el router no es una instancia de la clase FastAPI . Es decir, debemos tener la instancia de FastAPI para resolver la URLRequest Este método es útil cuando puede acceder a la instancia de Request (la solicitud entrante), generalmente, dentro de una vista.
from fastapi import FastAPI, Request app = FastAPI() @app.get('/hello/') def hello_world(): return {"msg": "Hello World"} @app.get('/hello/{number}/') def hello_world_number(number: int): return {"msg": "Hello World Number", "number": number} @app.get('/') def named_url_reveres(request: Request): return { "URL for 'hello_world'": request.url_for("hello_world"), "URL for 'hello_world_number' with number '1'": request.url_for("hello_world_number", number=1), "URL for 'hello_world_number' with number '2''": request.url_for("hello_world_number", number=2}) } # Result Response { "URL for 'hello_world'": "http://0.0.0.0:6022/hello/", "URL for 'hello_world_number' with number '1'": "http://0.0.0.0:6022/hello/1/", "URL for 'hello_world_number' with number '2''": "http://0.0.0.0:6022/hello/2/" }request en cada vista (o requerida) para resolver la URL, lo que podría generar una sensación desagradable para los desarrolladores.En realidad, no es necesario reinventar la rueda. FastAPI es compatible con esto listo para usar (en realidad, Starlette) , y funciona bastante bien.
app = FastAPI() @app.get("/hello/{number}/") def hello_world_number(number: int): return {"msg": "Hello World Number", "number": number}Si tiene un punto final como este, simplemente puede usar
In: app.url_path_for("hello_world_number", number=3) In: app.url_path_for("hello_world_number", number=50) Out: /hello/3/ Out: /hello/50/En FastAPI , APIRouter y FastAPI(APIRoute) se heredan del enrutador (de Starlette), por lo tanto, si tiene un APIRouter como este, puede seguir usando esta función.
router = APIRouter() @router.get("/hello") def hello_world(): return {"msg": "Hello World"} In: router.url_path_for("hello_world") Out: /hellourl_for existe, pero lo proporciona starlette, el servidor que sustenta FastApi: https://www.starlette.io/routing/#reverse-url-lookups