You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastAPI传递函数给Depends时报错:生成器对象不是可调用对象

解决TypeError: <generator object get_db at ...> is not a callable object问题

错误信息

文件 "C:\PythonProjects\myProject\routers\home.py",第39行,位于
@router.get("/home", response_class=HTMLResponse)
...
raise TypeError('{!r} is not a callable object'.format(obj))
TypeError: <generator object get_db at 0x000002B68FBDB100> is not a callable object

相关代码文件

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})

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

解决方案

问题根源在于Depends的参数传递错误:

  • 你在Depends(get_db())里调用了get_db()函数,这会直接返回一个生成器对象,而Depends需要接收的是一个可调用对象(比如函数本身),而非函数执行后的结果,因此触发了TypeError。

修改步骤:

  1. 将home.py中的路由函数参数修改为:
async def all_skills(request: Request, db: Session = Depends(get_db)):

(去掉get_db后的括号,传递函数本身而非调用结果)

  1. 额外注意:db.query()需要指定要查询的模型类,否则会报错。假设你的模型是Skill,应修改为:
all_skills = db.query(models.Skill).all()

(调用.all()才能获取查询结果列表)

修改后的home.py路由函数部分:

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

内容的提问来源于stack exchange,提问作者sata mems

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 19:43:22