FastAPI 在将数据库函数添加到 Depends 时引发“TypeError: <generator object get_db at 0x000002B68FBDB100> 不是可调用对象”

问题描述 投票:0回答:3

我得到:

文件“C:\PythonProjects\myProject 外部\home.py”,第 39 行,在 @router.get("/home", response_class=HTMLResponse)

...

raise TypeError('{!r} 不是可调用对象'.format(obj)) 类型错误: 不是 可调用对象

home.py

    from fastapi import Depends, APIRouter, Request
    from fastapi.templating import Jinja2Templates
    from sqlalchemy.orm import Session
    from starlette.responses import HTMLResponse
    
    from database import SessionLocal, engine
    from models import Base
    
    router = APIRouter()
    templates = Jinja2Templates(directory="templates", autoescape=False)
    Base.metadata.create_all(bind=engine)
    
    
    def get_db():
        try:
            db = SessionLocal()
            yield db
        finally:
            db.close()

@router.get("/home", response_class=HTMLResponse)
async def all_skills(request: Request, db: Session = Depends(get_db())):
    all = db.query()
    return templates.TemplateResponse("home.html", {"request": request, "show": all})

数据库.py

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

SQL_ALCHEMY_DATABASE_URL = "postgresql://postgres:password@localhost/DatabaseName"

engine = create_engine(SQL_ALCHEMY_DATABASE_URL)

SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()

main.py

from fastapi import FastAPI

import models
from database import engine
from routers import home
from starlette.staticfiles import StaticFiles


app = FastAPI()

models.Base.metadata.create_all(bind=engine)

app.mount("/static", StaticFiles(directory="static"), name="static")

app.include_router(home.router)
python database postgresql generator fastapi
3个回答
1
投票

您不应该调用要用作依赖项的函数:

Depends(get_db)

而不是

Depends(get_db())

0
投票

您用作依赖项

@router.get("/home", response_class=HTMLResponse)
async def all_skills(request: Request, db: Session = Depends(get_db)):
    all = db.query()
    return templates.TemplateResponse("home.html", {"request": request, "show": all})

0
投票

根据 FastAPI 的 文档

您只给

Depends
一个参数。

这个参数必须是类似函数的东西。

不要直接调用它(不要在末尾添加括号), 您只需将其作为参数传递给

Depends()

每当有新请求到达时,FastAPI 都会处理

  • 使用正确的参数调用您的依赖(“可靠”)函数。
  • 从函数中获取结果。
  • 将该结果分配给路径操作函数中的参数。

因此,在您的示例中,您不应该直接调用

get_db
函数,就像一直在做的那样:

@router.get("/home", response_class=HTMLResponse)
async def all_skills(request: Request, db: Session = Depends(get_db())):
    pass                                                     ^^^^^^^^

相反,只需将其作为参数传递给

Depends()
:

@router.get("/home", response_class=HTMLResponse)
async def all_skills(request: Request, db: Session = Depends(get_db)):
    pass
© www.soinside.com 2019 - 2024. All rights reserved.