Recibo este error cuando intento ejecutar mi API FastApi.
app = cls(app=app, **options) TypeError: el objeto 'módulo' no se puede llamar
Estoy tratando de agregar un middleware en otra carpeta separada de main.py y no sé por qué no funciona. De lo contrario, cuando agrego el código de middleware en main.py funciona sin problemas. Aquí está mi código, gracias por su ayuda y disculpe mi inglés.
principal.py
from fastapi import FastAPI from fastapi import Depends, FastAPI, HTTPException from fastapi import Request from routers import rutas from utils import CheckApiKey from utils.CheckApiKey import check_api_key app = FastAPI() app.add_middleware(CheckApiKey, dispatch=check_api_key) <--- Here calling middleware app.include_router(rutas.router) if __name__ == "__main__": import uvicorn uvicorn.run("main:app", host="127.0.0.1", port=8000, reload=True)software intermedio
from fastapi import Request async def check_api_key(request: Request, call_next): print("ok") response = await call_next(request) return responseEncontré la solución... Tengo que crear una clase que herede de starlette basehttpmiddleare, así.
from starlette.middleware.base import BaseHTTPMiddleware class CheckApiKey(BaseHTTPMiddleware): async def dispatch(self, request, call_next): print("ok") response = await call_next(request) return responseCheckApiKey parece un módulo de Python en su caso y check_api_key es la función de middleware.
El problema era que el método add_middleware() espera que el primer argumento sea una función invocable o una clase invocable . Pero en tu caso, te dieron un módulo .
Asi que,
Cambie su declaración como,
app.add_middleware( check_api_key )