属性错误:“取决于”对象没有属性“查询”FastAPI

Tob*_*Sko 22 dependency-injection fastapi

所以我试图在这里编写简单的函数,但是每次我运行 swagger 时,都会出现上述错误。

这是我的功能:

def authenticate_user(username: str, password: str, db: Session = Depends(bd.get_db)):
    user = db.query(bd.User.username).filter(username == username).first()
    if not user:
        return False
    if not verify_password(password, user.password_hash):
        return False
    return user
Run Code Online (Sandbox Code Playgroud)

这是我的 get_db 函数,它非常标准:

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()
Run Code Online (Sandbox Code Playgroud)

我注意到它Depends(bd.get_db)在端点函数(带有@app.post/@app.get装饰器的函数)中工作得很好,但在普通函数中却不起作用。

显然,我不太理解依赖注入的概念,但我还不能完全理解它。

Zho*_*gbo 48

该页面对我帮助很大,https://github.com/tiangolo/fastapi/issues/1693#issuecomment-665833384

你不能在自己的函数中使用 Depends,它必须在 FastAPI 函数中,主要是路由。但是,当该函数也是依赖项时,您可以在自己的函数中使用 Depends,因此可以具有一系列函数。

例如,一条路由使用 Depends 来解析“getcurrentuser”,该路由也使用 Depends 来解析“getdb”,整个链将被解析。但是,如果您随后在不使用 Depends 的情况下调用“getcurrentuser”,它将无法解析“getdb”。

我所做的就是从路由中获取数据库会话,然后将其向下传递到每个层和函数。我相信这也是更好的设计。

  • 谢谢。令人烦恼的是,文档没有提及 DI 实际可以在哪些函数中使用。 (4认同)
  • 令我震惊的是,流行的 python 框架之一违反了 SOLID 依赖倒置原则 (4认同)
  • 这使得单元测试功能变得相当不方便 (2认同)