我得到:
文件“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)
您不应该调用要用作依赖项的函数:
Depends(get_db)
而不是
Depends(get_db())
您用作依赖项
@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})
根据 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