From 9b03d51276d134c52d0212034cbea795ef207d01 Mon Sep 17 00:00:00 2001 From: Michiel Scholten Date: Sat, 3 Jan 2026 23:45:39 +0100 Subject: [PATCH] Better declaration of the httpx client --- src/digimarks/main.py | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/digimarks/main.py b/src/digimarks/main.py index 940abba..7369c2a 100644 --- a/src/digimarks/main.py +++ b/src/digimarks/main.py @@ -4,7 +4,7 @@ import logging from collections.abc import Sequence from contextlib import asynccontextmanager from datetime import UTC, datetime -from typing import Annotated +from typing import Annotated, AsyncGenerator, cast import httpx from fastapi import Depends, FastAPI, HTTPException, Query, Request @@ -54,22 +54,32 @@ engine = create_async_engine(f'sqlite+aiosqlite:///{settings.database_file}', co async def get_session() -> AsyncSession: """SQLAlchemy session factory.""" - async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False) + async_session = sessionmaker(bind=engine, class_=AsyncSession, expire_on_commit=False) async with async_session() as session: yield session +# Shorter way of getting the DB session in an endpoint SessionDep = Annotated[AsyncSession, Depends(get_session)] @asynccontextmanager -async def lifespan(the_app: FastAPI): +async def lifespan(the_app: FastAPI) -> AsyncGenerator[None, None]: """Upon start, initialise an AsyncClient and assign it to an attribute named requests_client on the app object.""" - the_app.requests_client = httpx.AsyncClient() - yield - await the_app.requests_client.aclose() + async with httpx.AsyncClient() as requests_client: + the_app.state.requests_client = requests_client + yield + await the_app.state.requests_client.aclose() +async def get_requests_client(request: Request) -> httpx.AsyncClient: + """Get the httpx client from the application object.""" + return cast(httpx.AsyncClient, request.app.state.requests_client) + + +# Shorter way of getting the httpx client in an endpoint +RequestsDep = Annotated[AsyncSession, Depends(get_requests_client)] + app = FastAPI(lifespan=lifespan) app.mount('/static', StaticFiles(directory=settings.static_dir), name='static') app.mount('/content/favicons', StaticFiles(directory=settings.favicons_dir), name='favicons')