es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  

Answer

  1. Avatar for 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 bloque else se está ejecutando incluso cuando la condición en el bloque if es verdadera. Esto se debe a que la línea await 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:

    @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:
            response = await call_next(request)
            return response
    

    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 llamada await. Esto garantiza que la segunda función de middleware api_route no se llame innecesariamente.

    Además, en la segunda función de middleware api_route, el parámetro call_back debería ser call_next, que es el nombre correcto de la función llamable que representa al siguiente middleware o al controlador de la ruta.

    @app.middleware("http")
    async def api_route(request: Request, call_next):
        if request.url.path == "/api":
            return JSONResponse(content={"api": True}, status_code=200)
        return await call_next(request)
    

    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.

Comments are closed.