Estoy escribiendo un servidor API rápido que acepta solicitudes, verifica si los usuarios están autorizados y luego los redirige a otra URL si tiene éxito.
Necesito transferir parámetros de URL, por ejemplo
http://localhost:80/data/?param1=val1¶m2=val2 debería redirigir a http://some.other.api/?param1=val1¶m2=val2 , manteniendo así los parámetros previamente asignados.
Los parámetros no los controlo yo y pueden cambiar en cualquier momento.
¿Cómo puedo conseguir esto?
Código:
from fastapi import FastAPI from starlette.responses import RedirectResponse app = FastAPI() @app.get("/data/") async def api_data(): params = '' # I need this value url = f'http://some.other.api/{params}' response = RedirectResponse(url=url) return responseEn los documentos hablan sobre el uso de la Solicitud directamente , lo que me lleva a esto :
from fastapi import FastAPI, Request from starlette.responses import RedirectResponse app = FastAPI() @app.get("/data/") async def api_data(request: Request): params = request.query_params url = f'http://some.other.api/?{params}' response = RedirectResponse(url=url) return responseComo se menciona en los documentos de FastAPI https://fastapi.tiangolo.com/tutorial/query-params-str-validations/ .
@app.get("/") def read_root(param1: Optional[str] = None, param2: Optional[str] = None): url = f'http://some.other.api/{param1}/{param2}' return {'url': str(url)}producción
Si los parámetros de consulta se conocen al iniciar la API pero aún desea que se establezcan dinámicamente:
from fastapi import FastAPI, Depends from pydantic import create_model app = FastAPI() # Put your query arguments in this dict query_params = {"name": (str, "me")} query_model = create_model("Query", **params) # This is subclass of pydantic BaseModel # Create a route @app.get("/items") async def get_items(params: query_model = Depends()): params_as_dict = params.dict() ...Esto tiene la ventaja de que ve los parámetros en la documentación automática:
Pero aún puede definirlos dinámicamente (al iniciar la API).
Nota: si su modelo tiene dictados, listas u otros modelos base como tipos de campo, aparece el cuerpo de la solicitud. GET no debe tener contenido de cuerpo, por lo que es posible que desee evitar esos tipos.
Obtenga más información sobre la creación de modelos dinámicos en la documentación de Pydantic .