Skip to content

Update FastAPI examples to use Annotated[..., Depends(Provide[...])] #853

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Feb 23, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/wiring.rst
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ FastAPI example:

@app.api_route("/")
@inject
async def index(service: Service = Depends(Provide[Container.service])):
async def index(service: Annotated[Service, Depends(Provide[Container.service])]):
value = await service.process()
return {"result": value}

Expand Down
12 changes: 8 additions & 4 deletions examples/miniapps/fastapi-redis/fastapiredis/application.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,22 @@
"""Application module."""

from dependency_injector.wiring import inject, Provide
from fastapi import FastAPI, Depends
from typing import Annotated

from fastapi import Depends, FastAPI

from dependency_injector.wiring import Provide, inject

from .containers import Container
from .services import Service


app = FastAPI()


@app.api_route("/")
@inject
async def index(service: Service = Depends(Provide[Container.service])):
async def index(
service: Annotated[Service, Depends(Provide[Container.service])]
) -> dict[str, str]:
value = await service.process()
return {"result": value}

Expand Down
9 changes: 7 additions & 2 deletions examples/miniapps/fastapi-simple/fastapi_di_example.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
from fastapi import FastAPI, Depends
from typing import Annotated

from fastapi import Depends, FastAPI

from dependency_injector import containers, providers
from dependency_injector.wiring import Provide, inject

Expand All @@ -18,7 +21,9 @@ class Container(containers.DeclarativeContainer):

@app.api_route("/")
@inject
async def index(service: Service = Depends(Provide[Container.service])):
async def index(
service: Annotated[Service, Depends(Provide[Container.service])]
) -> dict[str, str]:
result = await service.process()
return {"result": result}

Expand Down
21 changes: 12 additions & 9 deletions examples/miniapps/fastapi-sqlalchemy/webapp/endpoints.py
Original file line number Diff line number Diff line change
@@ -1,28 +1,31 @@
"""Endpoints module."""

from typing import Annotated

from fastapi import APIRouter, Depends, Response, status
from dependency_injector.wiring import inject, Provide

from dependency_injector.wiring import Provide, inject

from .containers import Container
from .services import UserService
from .repositories import NotFoundError
from .services import UserService

router = APIRouter()


@router.get("/users")
@inject
def get_list(
user_service: UserService = Depends(Provide[Container.user_service]),
user_service: Annotated[UserService, Depends(Provide[Container.user_service])],
):
return user_service.get_users()


@router.get("/users/{user_id}")
@inject
def get_by_id(
user_id: int,
user_service: UserService = Depends(Provide[Container.user_service]),
user_id: int,
user_service: Annotated[UserService, Depends(Provide[Container.user_service])],
):
try:
return user_service.get_user_by_id(user_id)
Expand All @@ -33,17 +36,17 @@ def get_by_id(
@router.post("/users", status_code=status.HTTP_201_CREATED)
@inject
def add(
user_service: UserService = Depends(Provide[Container.user_service]),
user_service: Annotated[UserService, Depends(Provide[Container.user_service])],
):
return user_service.create_user()


@router.delete("/users/{user_id}", status_code=status.HTTP_204_NO_CONTENT)
@inject
def remove(
user_id: int,
user_service: UserService = Depends(Provide[Container.user_service]),
):
user_id: int,
user_service: Annotated[UserService, Depends(Provide[Container.user_service])],
) -> Response:
try:
user_service.delete_user_by_id(user_id)
except NotFoundError:
Expand Down
21 changes: 13 additions & 8 deletions examples/miniapps/fastapi/giphynavigator/endpoints.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
"""Endpoints module."""

from typing import Optional, List
from typing import Annotated, List

from fastapi import APIRouter, Depends
from pydantic import BaseModel
from dependency_injector.wiring import inject, Provide

from .services import SearchService
from dependency_injector.wiring import Provide, inject

from .containers import Container
from .services import SearchService


class Gif(BaseModel):
Expand All @@ -26,11 +27,15 @@ class Response(BaseModel):
@router.get("/", response_model=Response)
@inject
async def index(
query: Optional[str] = None,
limit: Optional[str] = None,
default_query: str = Depends(Provide[Container.config.default.query]),
default_limit: int = Depends(Provide[Container.config.default.limit.as_int()]),
search_service: SearchService = Depends(Provide[Container.search_service]),
default_query: Annotated[str, Depends(Provide[Container.config.default.query])],
default_limit: Annotated[
int, Depends(Provide[Container.config.default.limit.as_int()])
],
search_service: Annotated[
SearchService, Depends(Provide[Container.search_service])
],
query: str | None = None,
limit: int | None = None,
):
query = query or default_query
limit = limit or default_limit
Expand Down