| """ |
| Request ID middleware — attaches a unique request ID for tracing. |
| |
| Adds `request.request_id` and sets the `X-Request-ID` response header. |
| """ |
| import uuid |
|
|
|
|
| class RequestIDMiddleware: |
| """ |
| Attach a unique request ID to every request for observability and tracing. |
| |
| If the client sends an `X-Request-ID` header, it is reused. |
| Otherwise, a new UUID4 is generated. |
| """ |
|
|
| def __init__(self, get_response): |
| self.get_response = get_response |
|
|
| def __call__(self, request): |
| request_id = request.headers.get("X-Request-ID") or str(uuid.uuid4()) |
| request.request_id = request_id |
|
|
| response = self.get_response(request) |
| response["X-Request-ID"] = request_id |
| return response |
|
|