Usage With Frameworks
Usage with Django
from config.dependencies import di # application-wide instance of the container
from myapp.services import SomeService
# function-based view
@di.inject
def my_function_view(request, service: Annotated[SomeService, ...]):
useful_info = service.get_some_info()
return render(request, 'myapp/my_template.html', {'info': useful_info})
# class-based view
class MyClassView(View):
@di.inject
def __init__(self, service: Annotated: [SomeService, ...]):
self.service = service
...
Usage with Flask
from myapp.dependencies import di # application-wide instance of the container
from myapp.services import SomeService
@app.route("/api/service_info")
@di.inject
def service_info(service: Annotated[SomeService, ...]):
return jsonify(service.get_some_info())
Usage with FastAPI
FastAPI requires using its own Depends inside view function arguments. To comply with this requirement Container.fastapi() method is introduced.
from fastapi import FastAPI
from myapp.dependencies import di # application-wide instance of the container
from myapp.services import SomeService
app = FastAPI()
# di.inject decorator is not used
@app.get("/api/service_info")
async def service_info(service: Annotated[SomeService, di.fastapi(SomeService)]):
return service.get_some_info()
Under the hood di.fastapi(SomeService) resolves the dependency as usual (using di container contents) and wraps it with fastapi.Depends.