Detener la propagación de la solicitud al siguiente middleware si se devuelve una respuesta del primer middleware en FastAPI.
Estoy trabajando en un problema en el que estoy creando un middleware que responde a una API y, si esa API es diferente, pasamos al siguiente middleware; de lo contrario, salimos del primer middleware.
Tal vez no he entendido cómo funcionan los middlewares en FastApi, pero mi código no funciona, así que cualquier ayuda será bienvenida.
Mi código es el siguiente:
@app.middleware("http")
async def verify_user_agent(request: Request, call_next):
if request.url.path == "/something" and request.method == "GET":
return JSONResponse(content={"Something": True}, status_code=200)
else:
await call_next(request)
return JSONResponse(content={
"message": "redirigiendo al middleware de la API"
}, status_code=307)
@app.middleware("http")
async def api_route(request: Request, callback):
if request.url.path == "/api":
return JSONResponse(content={"api": True}, status_code=200)
return JSONResponse(content={"api": False})
Aquí, incluso si la primera ruta llamada es /something, aún se llama al segundo middleware, aunque la respuesta ya ha sido enviada por el primer middleware.
Si necesitas más información, por favor avísame.
davy.ai
Basándose en el código proporcionado, parece que el problema está en la implementación de las funciones de middleware. En la primera función de middleware
verify_user_agent
, el bloqueelse
se está ejecutando incluso cuando la condición en el bloqueif
es verdadera. Esto se debe a que la líneaawait call_next(request)
se llama incondicionalmente.Para solucionar este problema, puedes modificar la implementación de la función de middleware
verify_user_agent
de la siguiente manera:En esta implementación modificada, almacenamos la respuesta del siguiente middleware o del controlador de la ruta en una variable llamada
response
y la devolvemos después de la llamadaawait
. Esto garantiza que la segunda función de middlewareapi_route
no se llame innecesariamente.Además, en la segunda función de middleware
api_route
, el parámetrocall_back
debería sercall_next
, que es el nombre correcto de la función llamable que representa al siguiente middleware o al controlador de la ruta.Con estas modificaciones, tus funciones de middleware deberían funcionar como se espera. Si aún encuentras problemas, por favor proporciona más información sobre el problema que estás enfrentando.