mirror of
https://github.com/ets-labs/python-dependency-injector.git
synced 2025-02-23 07:00:57 +03:00
60 lines
1.4 KiB
Python
60 lines
1.4 KiB
Python
|
#!/usr/bin/env python
|
||
|
|
||
|
from logging import basicConfig, getLogger
|
||
|
|
||
|
from dependency_injector.containers import DeclarativeContainer
|
||
|
from dependency_injector.ext.starlette import Lifespan
|
||
|
from dependency_injector.providers import Factory, Resource, Self, Singleton
|
||
|
from starlette.applications import Starlette
|
||
|
from starlette.requests import Request
|
||
|
from starlette.responses import JSONResponse
|
||
|
from starlette.routing import Route
|
||
|
|
||
|
count = 0
|
||
|
|
||
|
|
||
|
def init():
|
||
|
log = getLogger(__name__)
|
||
|
log.info("Inittializing resources")
|
||
|
yield
|
||
|
log.info("Cleaning up resources")
|
||
|
|
||
|
|
||
|
async def homepage(request: Request) -> JSONResponse:
|
||
|
global count
|
||
|
response = JSONResponse({"hello": "world", "count": count})
|
||
|
count += 1
|
||
|
return response
|
||
|
|
||
|
|
||
|
class Container(DeclarativeContainer):
|
||
|
__self__ = Self()
|
||
|
lifespan = Singleton(Lifespan, __self__)
|
||
|
logging = Resource(
|
||
|
basicConfig,
|
||
|
level="DEBUG",
|
||
|
datefmt="%Y-%m-%d %H:%M",
|
||
|
format="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
|
||
|
)
|
||
|
init = Resource(init)
|
||
|
app = Factory(
|
||
|
Starlette,
|
||
|
debug=True,
|
||
|
lifespan=lifespan,
|
||
|
routes=[Route("/", homepage)],
|
||
|
)
|
||
|
|
||
|
|
||
|
container = Container()
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
import uvicorn
|
||
|
|
||
|
uvicorn.run(
|
||
|
container.app,
|
||
|
factory=True,
|
||
|
# NOTE: `None` prevents uvicorn from configuring logging, which is
|
||
|
# impossible via CLI
|
||
|
log_config=None,
|
||
|
)
|