Closed
Description
Expected Behaviour
After registering middleware to route, once endpoint is called, registered route is called before endpoint function.
Current Behaviour
Skips registered middleware on route and calls funvtion
Code snippet
# middlewares.py
class UserMiddleWare(BaseMiddlewareHandler):
def __init__(self, allowed_roles: list[UserRoles], authenticate: bool = True):
super().__init__()
self._allowed_roles = allowed_roles
self._authenticate = authenticate
def handler(self, app: APIGatewayRestResolver, next_middleware: NextMiddleware) -> Response:
...
return next_middleware(app)
# users.py
...
from aws_lambda_powertools.event_handler.router import APIGatewayRouter
router = APIGatewayRouter()
@router.get("/me", cors=True, middlewares=[UserMiddleWare(allowed_roles=[UserRoles.INFLUENCER], authenticate=False)])
def get_user():
user: UserDict = router.context["user"]
...
# main.py
...
app = APIGatewayRestResolver(
strip_prefixes=["/xxx"], debug=get_settings().STAGE in ["staging", "dev"], cors=cors_config
)
def log_request_response(app: APIGatewayRestResolver, next_middleware: NextMiddleware) -> Response:
logger.info("Incoming request", method=app.current_event.http_method, path=app.current_event.path)
logger.append_keys(
user_id=app.current_event.request_context.authorizer["id"],
role=app.current_event.request_context.authorizer["role"],
)
result = next_middleware(app)
logger.info("Response received", response=result.__dict__)
return result
app.use(
middlewares=[
log_request_response,
]
)
app.include_router(
users.router,
prefix="/users",
)
@logger.inject_lambda_context(correlation_id_path=correlation_paths.API_GATEWAY_REST)
@event_source(data_class=APIGatewayProxyEvent)
@tracer.capture_lambda_handler
def wallets_gateway_handler(event: APIGatewayProxyEvent, context: LambdaContext):
tracer.put_annotation(
"user", event.request_context.authorizer["role"] + str(event.request_context.authorizer["id"])
)
return app.resolve(event, context)
Possible Solution
No response
Steps to Reproduce
- Create app
- Create middleware
- Create route in separate file and attach middleware to specific endpoint without using
router.use()
- Include router to app with prefix
Powertools for AWS Lambda (Python) version
latest
AWS Lambda function runtime
3.11
Packaging format used
PyPi
Debugging logs
Processing Route:::get_user (/users/me)
Middleware Stack:
=================
log_request_response
_registered_api_adapter
=================
Metadata
Metadata
Assignees
Labels
Type
Projects
Status
Shipped