Search code examples
pythondatabasetypeerrorfastapidepends

FastAPI raises "TypeError: <generator object get_db at 0x00...> is not a callable object" when passing function to Depends


I get:

File "C:\PythonProjects\myProject\routers\home.py", line 39, in @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)

Solution

  • You to use as dependency

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

    instead of

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