В чем здесь проблема с внедрением зависимости? Почему здесь нужен параметр запроса?

Почему здесь нужен параметр запроса?

GetSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
@app.post('/blog', status_code=201)
def create(request: BlogModel, session: Session = Depends(dependency=db.GetSessionLocal)):
    new_blog = db.BlogMap(title=request.title, body=request.body)
    session.add(new_blog)
    session.commit()
    session.refresh(instance=new_blog)
    return new_blog

Я же внедрил зависимость Depends, а не query param, почему нужен какой-то local_kw?


Ответы (1 шт):

Автор решения: insolor

На основе примеров с официального сайта FastAPI: SQL (Relational) Databases

Нужно создать отдельную функцию, которая будет вызывать GetSessionLocal() (в официальной документации SessionLocal) и передавать наружу через yield. Эту функцию уже нужно указать как зависимость через параметры:

# Копипаста частей примеров из документации
from sqlalchemy.orm import sessionmaker

...

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


def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()


@app.post("/users/", response_model=schemas.User)
def create_user(user: schemas.UserCreate, db: Session = Depends(get_db)):
    db_user = crud.get_user_by_email(db, email=user.email)
    if db_user:
        raise HTTPException(status_code=400, detail="Email already registered")
    return crud.create_user(db=db, user=user)

На вашем коде (имена переменных и функций поменял под свое видение, так же я бы поменял GetSessionLocal просто на SessionLocal):

def get_session_local():
    session = db.GetSessionLocal()
    try:
        yield session
    finally:
        session.close()


@app.post('/blog', status_code=201)
def create(request: BlogModel, session: Session = Depends(dependency=get_session_local)):
    new_blog = db.BlogMap(title=request.title, body=request.body)
    session.add(new_blog)
    session.commit()
    session.refresh(instance=new_blog)
    return new_blog
→ Ссылка