import logging from contextlib import asynccontextmanager from fastapi import FastAPI from redis.asyncio import from_url as redis_from_url from proxy_pool.config import get_settings from proxy_pool.db.session import create_session_factory from proxy_pool.plugins.discovery import discover_plugins from proxy_pool.plugins.registry import PluginRegistry logger = logging.getLogger(__name__) @asynccontextmanager async def lifespan(app: FastAPI): settings = get_settings() # Database session_factory = create_session_factory(settings) app.state.session_factory = session_factory app.state.engine = session_factory.kw["bind"] # Redis redis = redis_from_url( settings.redis.url, decode_responses=True, ) app.state.redis = redis # Plugin registry registry = PluginRegistry() discover_plugins("proxy_pool.plugins.builtin.parsers", registry, settings) discover_plugins("proxy_pool.plugins.builtin.checkers", registry, settings) discover_plugins("proxy_pool.plugins.builtin.notifiers", registry, settings) app.state.registry = registry logger.info( "Started with %d parsers, %d checkers, %d notifiers", len(registry.parsers), len(registry.checkers), len(registry.notifiers), ) yield # Cleanup await redis.close() await app.state.engine.dispose() def create_app() -> FastAPI: settings = get_settings() app = FastAPI( title=settings.app_name, lifespan=lifespan, ) # Register routers here as we build them # app.include_router(...) return app