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。
修改步骤:
- 将
home.py中的路由函数参数修改为:
async def all_skills(request: Request, db: Session = Depends(get_db)):
(去掉get_db后的括号,传递函数本身而非调用结果)
- 额外注意:
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
相关产品推荐
相关产品推荐

