from starlette.requests import Request from starlette.types import ASGIApp, Receive, Scope, Send from .bgtask import BgTasks class SimpleBaseMiddleware: def __init__(self, app: ASGIApp) -> None: self.app = app async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: if scope["type"] != "http": await self.app(scope, receive, send) return request = Request(scope, receive=receive) response = await self.before_request(request) or self.app await response(request.scope, request.receive, send) await self.after_request(request) async def before_request(self, request: Request): return self.app async def after_request(self, request: Request): return None class BackGroundTaskMiddleware(SimpleBaseMiddleware): async def before_request(self, request): await BgTasks.init_bg_tasks_obj() async def after_request(self, request): await BgTasks.execute_tasks()