不同文件夹上的 FastApi 中间件不起作用

FastApi middleware on different folder not working

我在尝试 运行 我的 FastApi api 时收到此错误。

app = cls(app=app, **options) TypeError: 'module' object is not callable

我正在尝试在与 main.py 分开的其他文件夹中添加中间件,但不知道为什么不起作用。否则,当我将中间件代码添加到 main.py 时,可以正常工作。这是我的代码,谢谢你的帮助,请原谅我的英语。

main.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)

中间件

from fastapi import Request

async def check_api_key(request: Request, call_next):    

  print("ok")
  response = await call_next(request) 

  return response

CheckApiKey 看起来像一个 python 模块在你的例子中 check_api_key 是中间件函数。

问题是,add_middleware() 方法需要第一个参数作为 可调用函数或可调用 class。但在你的情况下,你得到了一个 module.

所以,

将您的陈述更改为,

app.add_middleware(<b>check_api_key</b>) 

我找到了解决方案...我必须创建一个 class 继承自 starlette basehttp 中间件,就像这样。

from starlette.middleware.base import BaseHTTPMiddleware


class CheckApiKey(BaseHTTPMiddleware):
 async def dispatch(self, request, call_next):
    print("ok")
    response = await call_next(request)

    return response