Summary
This release brings dependency injection, an enriched Request object, OpenAPI improvements, and internal refactoring to the Event Handler.
- Dependency injection: type-safe
Depends()with nested resolution, caching, and test overrides - Enriched Request:
resolved_eventandcontextproperties bridge middleware and dependencies - OpenAPI status_code: set default response status code on route decorators
- Query string fix: parameters no longer dropped when both single and multi-value query strings are present
A huge thanks to @JustinBerger, @Iamrodos, and @ran-isenberg for their contributions!
Dependency injection with Depends()
You can now use Depends() to declare typed dependencies directly in route handler signatures: no decorators, no global state. Dependencies are resolved automatically, cached per invocation, and support nested dependency trees.
import os
from typing import Any
import boto3
from typing_extensions import Annotated
from aws_lambda_powertools.event_handler import APIGatewayHttpResolver
from aws_lambda_powertools.event_handler.depends import Depends
from aws_lambda_powertools.utilities.typing import LambdaContext
app = APIGatewayHttpResolver()
def get_dynamodb_table():
dynamodb = boto3.resource("dynamodb")
return dynamodb.Table(os.environ["TABLE_NAME"])
@app.get("/orders")
def list_orders(table: Annotated[Any, Depends(get_dynamodb_table)]):
return table.scan()["Items"]For testing, swap any dependency without monkeypatching:
app.dependency_overrides[get_dynamodb_table] = lambda: mock_tableEnriched Request object
The Request object now exposes resolved_event and context, enabling dependency functions to access the full Powertools event and bridge data with middleware.
from typing_extensions import Annotated
from aws_lambda_powertools.event_handler import APIGatewayHttpResolver, Response
from aws_lambda_powertools.event_handler.depends import Depends
from aws_lambda_powertools.event_handler.request import Request
app = APIGatewayHttpResolver()
# Middleware handles auth: can return HTTP responses (redirects, 401s)
def auth_middleware(app, next_middleware):
token = app.current_event.headers.get("authorization", "")
if not token:
return Response(status_code=401, body="Unauthorized")
app.append_context(user={"id": "user-123", "role": "admin"})
return next_middleware(app)
app.use(middlewares=[auth_middleware])
# Depends() reads what middleware wrote via request.context
def get_current_user(request: Request) -> dict:
return request.context["user"]
@app.get("/admin/dashboard")
def admin_dashboard(user: Annotated[dict, Depends(get_current_user)]):
return {"message": f"Welcome {user['id']}", "role": user["role"]}OpenAPI status_code field
You can now set the default response status code directly on route decorators. This is reflected in the generated OpenAPI schema and Swagger UI.
from aws_lambda_powertools.event_handler import APIGatewayRestResolver
app = APIGatewayRestResolver(enable_validation=True)
@app.post(
"/todos",
summary="Creates a new todo item",
status_code=201,
tags=["Todos"],
)
def create_todo(title: str) -> dict:
return {"id": 1, "title": title}Changes
- fix(data_class): merge querystring parameters in ALB/APIGW classes (#8154) by @leandrodamascena
- fix(event_handler): read swagger files with UTF-8 encoding (#8131) by @JustinBerger
- refactor(event_handlers): remove unnecessary init methods (#8127) by @leandrodamascena
- refactor(event_handler): refactoring encoder file (#8126) by @leandrodamascena
- refactor(event_handler): refactoring proxy events (#8125) by @leandrodamascena
- refactor(event_handler): refactoring params to reduce code (#8124) by @leandrodamascena
- refactor(event_handler): extract OpenAPI schema generation from Route class (#8098) by @leandrodamascena
📜 Documentation updates
- feat(event_handler): enrich request object (#8153) by @leandrodamascena
- feat(event_handler): adding status_code OpenAPI field (#8130) by @leandrodamascena
- docs: adding new Lambda features (#7917) by @leandrodamascena
- feat(event_handler): add Dependency injection with Depends() (#8128) by @leandrodamascena
- docs: add openapi docs (#7939) by @leandrodamascena
🔧 Maintenance
- chore: bump dependabot dependencies. (#8152) by @leandrodamascena
- chore(deps-dev): bump aws-cdk from 2.1117.0 to 2.1118.0 in the aws-cdk group (#8142) by @dependabot[bot]
- chore(deps): bump cryptography from 46.0.6 to 46.0.7 (#8132) by @dependabot[bot]
- chore(deps-dev): bump testcontainers from 4.14.1 to 4.14.2 (#8116) by @dependabot[bot]
- chore(deps-dev): bump cfn-lint from 1.46.0 to 1.48.1 (#8113) by @dependabot[bot]
- chore(deps-dev): bump types-python-dateutil from 2.9.0.20260305 to 2.9.0.20260402 (#8114) by @dependabot[bot]
- chore(deps-dev): bump aws-cdk from 2.1115.0 to 2.1117.0 in the aws-cdk group (#8111) by @dependabot[bot]
- chore(deps-dev): bump boto3-stubs from 1.42.74 to 1.42.84 (#8115) by @dependabot[bot]
- chore(deps-dev): bump types-protobuf from 6.32.1.20260221 to 7.34.1.20260403 (#8117) by @dependabot[bot]
This release was made possible by the following contributors:
@JustinBerger, @dependabot[bot], @github-actions[bot], @leandrodamascena, dependabot[bot] and github-actions[bot]