Browse Source

Add support for generating a UUID on application startup

pull/15243/head
fady nabil 4 months ago
parent
commit
a74243c907
  1. 50
      fastapi/applications.py

50
fastapi/applications.py

@ -1,6 +1,7 @@
from collections.abc import Awaitable, Callable, Coroutine, Sequence from collections.abc import Awaitable, Callable, Coroutine, Sequence
from enum import Enum from enum import Enum
from typing import Annotated, Any, TypeVar from typing import Annotated, Any, TypeVar
import uuid
from annotated_doc import Doc from annotated_doc import Doc
from fastapi import routing from fastapi import routing
@ -859,6 +860,43 @@ class FastAPI(Starlette):
""" """
), ),
] = True, ] = True,
generate_startup_uuid: Annotated[
bool,
Doc(
"""
Whether to generate a random UUID on application startup.
The generated UUID will be stored in `app.startup_uuid`.
**Example**
```python
from fastapi import FastAPI
app = FastAPI(generate_startup_uuid=True)
print(app.startup_uuid) # UUID('...')
```
"""
),
] = False,
startup_uuid_version: Annotated[
str,
Doc(
"""
The version of UUID to generate on startup if `generate_startup_uuid` is True.
Supported versions: 'v4' (random UUID), 'v7' (time-based UUID with random component, requires Python 3.12+).
**Example**
```python
from fastapi import FastAPI
app = FastAPI(generate_startup_uuid=True, startup_uuid_version="v7")
```
"""
),
] = "v4",
**extra: Annotated[ **extra: Annotated[
Any, Any,
Doc( Doc(
@ -889,6 +927,8 @@ class FastAPI(Starlette):
self.separate_input_output_schemas = separate_input_output_schemas self.separate_input_output_schemas = separate_input_output_schemas
self.openapi_external_docs = openapi_external_docs self.openapi_external_docs = openapi_external_docs
self.extra = extra self.extra = extra
self.generate_startup_uuid = generate_startup_uuid
self.startup_uuid_version = startup_uuid_version
self.openapi_version: Annotated[ self.openapi_version: Annotated[
str, str,
Doc( Doc(
@ -998,6 +1038,16 @@ class FastAPI(Starlette):
self.exception_handlers: dict[ self.exception_handlers: dict[
Any, Callable[[Request, Any], Response | Awaitable[Response]] Any, Callable[[Request, Any], Response | Awaitable[Response]]
] = {} if exception_handlers is None else dict(exception_handlers) ] = {} if exception_handlers is None else dict(exception_handlers)
if self.generate_startup_uuid:
if self.startup_uuid_version == "v4":
self.startup_uuid = uuid.uuid4()
elif self.startup_uuid_version == "v7":
if hasattr(uuid, 'uuid7'):
self.startup_uuid = uuid.uuid7()
else:
raise ValueError("UUID v7 requires Python 3.12 or later")
else:
raise ValueError(f"Unsupported UUID version: {self.startup_uuid_version}")
self.exception_handlers.setdefault(HTTPException, http_exception_handler) self.exception_handlers.setdefault(HTTPException, http_exception_handler)
self.exception_handlers.setdefault( self.exception_handlers.setdefault(
RequestValidationError, request_validation_exception_handler RequestValidationError, request_validation_exception_handler

Loading…
Cancel
Save