prefect-client 2.20.2__py3-none-any.whl → 3.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (288) hide show
  1. prefect/__init__.py +74 -110
  2. prefect/_internal/compatibility/deprecated.py +6 -115
  3. prefect/_internal/compatibility/experimental.py +4 -79
  4. prefect/_internal/compatibility/migration.py +166 -0
  5. prefect/_internal/concurrency/__init__.py +2 -2
  6. prefect/_internal/concurrency/api.py +1 -35
  7. prefect/_internal/concurrency/calls.py +0 -6
  8. prefect/_internal/concurrency/cancellation.py +0 -3
  9. prefect/_internal/concurrency/event_loop.py +0 -20
  10. prefect/_internal/concurrency/inspection.py +3 -3
  11. prefect/_internal/concurrency/primitives.py +1 -0
  12. prefect/_internal/concurrency/services.py +23 -0
  13. prefect/_internal/concurrency/threads.py +35 -0
  14. prefect/_internal/concurrency/waiters.py +0 -28
  15. prefect/_internal/integrations.py +7 -0
  16. prefect/_internal/pydantic/__init__.py +0 -45
  17. prefect/_internal/pydantic/annotations/pendulum.py +2 -2
  18. prefect/_internal/pydantic/v1_schema.py +21 -22
  19. prefect/_internal/pydantic/v2_schema.py +0 -2
  20. prefect/_internal/pydantic/v2_validated_func.py +18 -23
  21. prefect/_internal/pytz.py +1 -1
  22. prefect/_internal/retries.py +61 -0
  23. prefect/_internal/schemas/bases.py +45 -177
  24. prefect/_internal/schemas/fields.py +1 -43
  25. prefect/_internal/schemas/validators.py +47 -233
  26. prefect/agent.py +3 -695
  27. prefect/artifacts.py +173 -14
  28. prefect/automations.py +39 -4
  29. prefect/blocks/abstract.py +1 -1
  30. prefect/blocks/core.py +423 -164
  31. prefect/blocks/fields.py +2 -57
  32. prefect/blocks/notifications.py +43 -28
  33. prefect/blocks/redis.py +168 -0
  34. prefect/blocks/system.py +67 -20
  35. prefect/blocks/webhook.py +2 -9
  36. prefect/cache_policies.py +239 -0
  37. prefect/client/__init__.py +4 -0
  38. prefect/client/base.py +33 -27
  39. prefect/client/cloud.py +65 -20
  40. prefect/client/collections.py +1 -1
  41. prefect/client/orchestration.py +667 -440
  42. prefect/client/schemas/actions.py +115 -100
  43. prefect/client/schemas/filters.py +46 -52
  44. prefect/client/schemas/objects.py +228 -178
  45. prefect/client/schemas/responses.py +18 -36
  46. prefect/client/schemas/schedules.py +55 -36
  47. prefect/client/schemas/sorting.py +2 -0
  48. prefect/client/subscriptions.py +8 -7
  49. prefect/client/types/flexible_schedule_list.py +11 -0
  50. prefect/client/utilities.py +9 -6
  51. prefect/concurrency/asyncio.py +60 -11
  52. prefect/concurrency/context.py +24 -0
  53. prefect/concurrency/events.py +2 -2
  54. prefect/concurrency/services.py +46 -16
  55. prefect/concurrency/sync.py +51 -7
  56. prefect/concurrency/v1/asyncio.py +143 -0
  57. prefect/concurrency/v1/context.py +27 -0
  58. prefect/concurrency/v1/events.py +61 -0
  59. prefect/concurrency/v1/services.py +116 -0
  60. prefect/concurrency/v1/sync.py +92 -0
  61. prefect/context.py +246 -149
  62. prefect/deployments/__init__.py +33 -18
  63. prefect/deployments/base.py +10 -15
  64. prefect/deployments/deployments.py +2 -1048
  65. prefect/deployments/flow_runs.py +178 -0
  66. prefect/deployments/runner.py +72 -173
  67. prefect/deployments/schedules.py +31 -25
  68. prefect/deployments/steps/__init__.py +0 -1
  69. prefect/deployments/steps/core.py +7 -0
  70. prefect/deployments/steps/pull.py +15 -21
  71. prefect/deployments/steps/utility.py +2 -1
  72. prefect/docker/__init__.py +20 -0
  73. prefect/docker/docker_image.py +82 -0
  74. prefect/engine.py +15 -2466
  75. prefect/events/actions.py +17 -23
  76. prefect/events/cli/automations.py +20 -7
  77. prefect/events/clients.py +142 -80
  78. prefect/events/filters.py +14 -18
  79. prefect/events/related.py +74 -75
  80. prefect/events/schemas/__init__.py +0 -5
  81. prefect/events/schemas/automations.py +55 -46
  82. prefect/events/schemas/deployment_triggers.py +7 -197
  83. prefect/events/schemas/events.py +46 -65
  84. prefect/events/schemas/labelling.py +10 -14
  85. prefect/events/utilities.py +4 -5
  86. prefect/events/worker.py +23 -8
  87. prefect/exceptions.py +15 -0
  88. prefect/filesystems.py +30 -529
  89. prefect/flow_engine.py +827 -0
  90. prefect/flow_runs.py +379 -7
  91. prefect/flows.py +470 -360
  92. prefect/futures.py +382 -331
  93. prefect/infrastructure/__init__.py +5 -26
  94. prefect/infrastructure/base.py +3 -320
  95. prefect/infrastructure/provisioners/__init__.py +5 -3
  96. prefect/infrastructure/provisioners/cloud_run.py +13 -8
  97. prefect/infrastructure/provisioners/container_instance.py +14 -9
  98. prefect/infrastructure/provisioners/ecs.py +10 -8
  99. prefect/infrastructure/provisioners/modal.py +8 -5
  100. prefect/input/__init__.py +4 -0
  101. prefect/input/actions.py +2 -4
  102. prefect/input/run_input.py +9 -9
  103. prefect/logging/formatters.py +2 -4
  104. prefect/logging/handlers.py +9 -14
  105. prefect/logging/loggers.py +5 -5
  106. prefect/main.py +72 -0
  107. prefect/plugins.py +2 -64
  108. prefect/profiles.toml +16 -2
  109. prefect/records/__init__.py +1 -0
  110. prefect/records/base.py +223 -0
  111. prefect/records/filesystem.py +207 -0
  112. prefect/records/memory.py +178 -0
  113. prefect/records/result_store.py +64 -0
  114. prefect/results.py +577 -504
  115. prefect/runner/runner.py +124 -51
  116. prefect/runner/server.py +32 -34
  117. prefect/runner/storage.py +3 -12
  118. prefect/runner/submit.py +2 -10
  119. prefect/runner/utils.py +2 -2
  120. prefect/runtime/__init__.py +1 -0
  121. prefect/runtime/deployment.py +1 -0
  122. prefect/runtime/flow_run.py +40 -5
  123. prefect/runtime/task_run.py +1 -0
  124. prefect/serializers.py +28 -39
  125. prefect/server/api/collections_data/views/aggregate-worker-metadata.json +5 -14
  126. prefect/settings.py +209 -332
  127. prefect/states.py +160 -63
  128. prefect/task_engine.py +1478 -57
  129. prefect/task_runners.py +383 -287
  130. prefect/task_runs.py +240 -0
  131. prefect/task_worker.py +463 -0
  132. prefect/tasks.py +684 -374
  133. prefect/transactions.py +410 -0
  134. prefect/types/__init__.py +72 -86
  135. prefect/types/entrypoint.py +13 -0
  136. prefect/utilities/annotations.py +4 -3
  137. prefect/utilities/asyncutils.py +227 -148
  138. prefect/utilities/callables.py +138 -48
  139. prefect/utilities/collections.py +134 -86
  140. prefect/utilities/dispatch.py +27 -14
  141. prefect/utilities/dockerutils.py +11 -4
  142. prefect/utilities/engine.py +186 -32
  143. prefect/utilities/filesystem.py +4 -5
  144. prefect/utilities/importtools.py +26 -27
  145. prefect/utilities/pydantic.py +128 -38
  146. prefect/utilities/schema_tools/hydration.py +18 -1
  147. prefect/utilities/schema_tools/validation.py +30 -0
  148. prefect/utilities/services.py +35 -9
  149. prefect/utilities/templating.py +12 -2
  150. prefect/utilities/timeout.py +20 -5
  151. prefect/utilities/urls.py +195 -0
  152. prefect/utilities/visualization.py +1 -0
  153. prefect/variables.py +78 -59
  154. prefect/workers/__init__.py +0 -1
  155. prefect/workers/base.py +237 -244
  156. prefect/workers/block.py +5 -226
  157. prefect/workers/cloud.py +6 -0
  158. prefect/workers/process.py +265 -12
  159. prefect/workers/server.py +29 -11
  160. {prefect_client-2.20.2.dist-info → prefect_client-3.0.0.dist-info}/METADATA +30 -26
  161. prefect_client-3.0.0.dist-info/RECORD +201 -0
  162. {prefect_client-2.20.2.dist-info → prefect_client-3.0.0.dist-info}/WHEEL +1 -1
  163. prefect/_internal/pydantic/_base_model.py +0 -51
  164. prefect/_internal/pydantic/_compat.py +0 -82
  165. prefect/_internal/pydantic/_flags.py +0 -20
  166. prefect/_internal/pydantic/_types.py +0 -8
  167. prefect/_internal/pydantic/utilities/config_dict.py +0 -72
  168. prefect/_internal/pydantic/utilities/field_validator.py +0 -150
  169. prefect/_internal/pydantic/utilities/model_construct.py +0 -56
  170. prefect/_internal/pydantic/utilities/model_copy.py +0 -55
  171. prefect/_internal/pydantic/utilities/model_dump.py +0 -136
  172. prefect/_internal/pydantic/utilities/model_dump_json.py +0 -112
  173. prefect/_internal/pydantic/utilities/model_fields.py +0 -50
  174. prefect/_internal/pydantic/utilities/model_fields_set.py +0 -29
  175. prefect/_internal/pydantic/utilities/model_json_schema.py +0 -82
  176. prefect/_internal/pydantic/utilities/model_rebuild.py +0 -80
  177. prefect/_internal/pydantic/utilities/model_validate.py +0 -75
  178. prefect/_internal/pydantic/utilities/model_validate_json.py +0 -68
  179. prefect/_internal/pydantic/utilities/model_validator.py +0 -87
  180. prefect/_internal/pydantic/utilities/type_adapter.py +0 -71
  181. prefect/_vendor/fastapi/__init__.py +0 -25
  182. prefect/_vendor/fastapi/applications.py +0 -946
  183. prefect/_vendor/fastapi/background.py +0 -3
  184. prefect/_vendor/fastapi/concurrency.py +0 -44
  185. prefect/_vendor/fastapi/datastructures.py +0 -58
  186. prefect/_vendor/fastapi/dependencies/__init__.py +0 -0
  187. prefect/_vendor/fastapi/dependencies/models.py +0 -64
  188. prefect/_vendor/fastapi/dependencies/utils.py +0 -877
  189. prefect/_vendor/fastapi/encoders.py +0 -177
  190. prefect/_vendor/fastapi/exception_handlers.py +0 -40
  191. prefect/_vendor/fastapi/exceptions.py +0 -46
  192. prefect/_vendor/fastapi/logger.py +0 -3
  193. prefect/_vendor/fastapi/middleware/__init__.py +0 -1
  194. prefect/_vendor/fastapi/middleware/asyncexitstack.py +0 -25
  195. prefect/_vendor/fastapi/middleware/cors.py +0 -3
  196. prefect/_vendor/fastapi/middleware/gzip.py +0 -3
  197. prefect/_vendor/fastapi/middleware/httpsredirect.py +0 -3
  198. prefect/_vendor/fastapi/middleware/trustedhost.py +0 -3
  199. prefect/_vendor/fastapi/middleware/wsgi.py +0 -3
  200. prefect/_vendor/fastapi/openapi/__init__.py +0 -0
  201. prefect/_vendor/fastapi/openapi/constants.py +0 -2
  202. prefect/_vendor/fastapi/openapi/docs.py +0 -203
  203. prefect/_vendor/fastapi/openapi/models.py +0 -480
  204. prefect/_vendor/fastapi/openapi/utils.py +0 -485
  205. prefect/_vendor/fastapi/param_functions.py +0 -340
  206. prefect/_vendor/fastapi/params.py +0 -453
  207. prefect/_vendor/fastapi/py.typed +0 -0
  208. prefect/_vendor/fastapi/requests.py +0 -4
  209. prefect/_vendor/fastapi/responses.py +0 -40
  210. prefect/_vendor/fastapi/routing.py +0 -1331
  211. prefect/_vendor/fastapi/security/__init__.py +0 -15
  212. prefect/_vendor/fastapi/security/api_key.py +0 -98
  213. prefect/_vendor/fastapi/security/base.py +0 -6
  214. prefect/_vendor/fastapi/security/http.py +0 -172
  215. prefect/_vendor/fastapi/security/oauth2.py +0 -227
  216. prefect/_vendor/fastapi/security/open_id_connect_url.py +0 -34
  217. prefect/_vendor/fastapi/security/utils.py +0 -10
  218. prefect/_vendor/fastapi/staticfiles.py +0 -1
  219. prefect/_vendor/fastapi/templating.py +0 -3
  220. prefect/_vendor/fastapi/testclient.py +0 -1
  221. prefect/_vendor/fastapi/types.py +0 -3
  222. prefect/_vendor/fastapi/utils.py +0 -235
  223. prefect/_vendor/fastapi/websockets.py +0 -7
  224. prefect/_vendor/starlette/__init__.py +0 -1
  225. prefect/_vendor/starlette/_compat.py +0 -28
  226. prefect/_vendor/starlette/_exception_handler.py +0 -80
  227. prefect/_vendor/starlette/_utils.py +0 -88
  228. prefect/_vendor/starlette/applications.py +0 -261
  229. prefect/_vendor/starlette/authentication.py +0 -159
  230. prefect/_vendor/starlette/background.py +0 -43
  231. prefect/_vendor/starlette/concurrency.py +0 -59
  232. prefect/_vendor/starlette/config.py +0 -151
  233. prefect/_vendor/starlette/convertors.py +0 -87
  234. prefect/_vendor/starlette/datastructures.py +0 -707
  235. prefect/_vendor/starlette/endpoints.py +0 -130
  236. prefect/_vendor/starlette/exceptions.py +0 -60
  237. prefect/_vendor/starlette/formparsers.py +0 -276
  238. prefect/_vendor/starlette/middleware/__init__.py +0 -17
  239. prefect/_vendor/starlette/middleware/authentication.py +0 -52
  240. prefect/_vendor/starlette/middleware/base.py +0 -220
  241. prefect/_vendor/starlette/middleware/cors.py +0 -176
  242. prefect/_vendor/starlette/middleware/errors.py +0 -265
  243. prefect/_vendor/starlette/middleware/exceptions.py +0 -74
  244. prefect/_vendor/starlette/middleware/gzip.py +0 -113
  245. prefect/_vendor/starlette/middleware/httpsredirect.py +0 -19
  246. prefect/_vendor/starlette/middleware/sessions.py +0 -82
  247. prefect/_vendor/starlette/middleware/trustedhost.py +0 -64
  248. prefect/_vendor/starlette/middleware/wsgi.py +0 -147
  249. prefect/_vendor/starlette/py.typed +0 -0
  250. prefect/_vendor/starlette/requests.py +0 -328
  251. prefect/_vendor/starlette/responses.py +0 -347
  252. prefect/_vendor/starlette/routing.py +0 -933
  253. prefect/_vendor/starlette/schemas.py +0 -154
  254. prefect/_vendor/starlette/staticfiles.py +0 -248
  255. prefect/_vendor/starlette/status.py +0 -199
  256. prefect/_vendor/starlette/templating.py +0 -231
  257. prefect/_vendor/starlette/testclient.py +0 -804
  258. prefect/_vendor/starlette/types.py +0 -30
  259. prefect/_vendor/starlette/websockets.py +0 -193
  260. prefect/blocks/kubernetes.py +0 -119
  261. prefect/deprecated/__init__.py +0 -0
  262. prefect/deprecated/data_documents.py +0 -350
  263. prefect/deprecated/packaging/__init__.py +0 -12
  264. prefect/deprecated/packaging/base.py +0 -96
  265. prefect/deprecated/packaging/docker.py +0 -146
  266. prefect/deprecated/packaging/file.py +0 -92
  267. prefect/deprecated/packaging/orion.py +0 -80
  268. prefect/deprecated/packaging/serializers.py +0 -171
  269. prefect/events/instrument.py +0 -135
  270. prefect/infrastructure/container.py +0 -824
  271. prefect/infrastructure/kubernetes.py +0 -920
  272. prefect/infrastructure/process.py +0 -289
  273. prefect/manifests.py +0 -20
  274. prefect/new_flow_engine.py +0 -449
  275. prefect/new_task_engine.py +0 -423
  276. prefect/pydantic/__init__.py +0 -76
  277. prefect/pydantic/main.py +0 -39
  278. prefect/software/__init__.py +0 -2
  279. prefect/software/base.py +0 -50
  280. prefect/software/conda.py +0 -199
  281. prefect/software/pip.py +0 -122
  282. prefect/software/python.py +0 -52
  283. prefect/task_server.py +0 -322
  284. prefect_client-2.20.2.dist-info/RECORD +0 -294
  285. /prefect/{_internal/pydantic/utilities → client/types}/__init__.py +0 -0
  286. /prefect/{_vendor → concurrency/v1}/__init__.py +0 -0
  287. {prefect_client-2.20.2.dist-info → prefect_client-3.0.0.dist-info}/LICENSE +0 -0
  288. {prefect_client-2.20.2.dist-info → prefect_client-3.0.0.dist-info}/top_level.txt +0 -0
@@ -1,946 +0,0 @@
1
- from enum import Enum
2
- from typing import (
3
- Any,
4
- Awaitable,
5
- Callable,
6
- Coroutine,
7
- Dict,
8
- List,
9
- Optional,
10
- Sequence,
11
- Type,
12
- TypeVar,
13
- Union,
14
- )
15
-
16
- from prefect._vendor.fastapi import routing
17
- from prefect._vendor.fastapi.datastructures import Default, DefaultPlaceholder
18
- from prefect._vendor.fastapi.encoders import DictIntStrAny, SetIntStr
19
- from prefect._vendor.fastapi.exception_handlers import (
20
- http_exception_handler,
21
- request_validation_exception_handler,
22
- websocket_request_validation_exception_handler,
23
- )
24
- from prefect._vendor.fastapi.exceptions import (
25
- RequestValidationError,
26
- WebSocketRequestValidationError,
27
- )
28
- from prefect._vendor.fastapi.logger import logger
29
- from prefect._vendor.fastapi.middleware.asyncexitstack import AsyncExitStackMiddleware
30
- from prefect._vendor.fastapi.openapi.docs import (
31
- get_redoc_html,
32
- get_swagger_ui_html,
33
- get_swagger_ui_oauth2_redirect_html,
34
- )
35
- from prefect._vendor.fastapi.openapi.utils import get_openapi
36
- from prefect._vendor.fastapi.params import Depends
37
- from prefect._vendor.fastapi.types import DecoratedCallable
38
- from prefect._vendor.fastapi.utils import generate_unique_id
39
- from prefect._vendor.starlette.applications import Starlette
40
- from prefect._vendor.starlette.datastructures import State
41
- from prefect._vendor.starlette.exceptions import HTTPException
42
- from prefect._vendor.starlette.middleware import Middleware
43
- from prefect._vendor.starlette.middleware.base import BaseHTTPMiddleware
44
- from prefect._vendor.starlette.middleware.errors import ServerErrorMiddleware
45
- from prefect._vendor.starlette.middleware.exceptions import ExceptionMiddleware
46
- from prefect._vendor.starlette.requests import Request
47
- from prefect._vendor.starlette.responses import HTMLResponse, JSONResponse, Response
48
- from prefect._vendor.starlette.routing import BaseRoute
49
- from prefect._vendor.starlette.types import ASGIApp, Lifespan, Receive, Scope, Send
50
-
51
- AppType = TypeVar("AppType", bound="FastAPI")
52
-
53
-
54
- class FastAPI(Starlette):
55
- def __init__(
56
- self: AppType,
57
- *,
58
- debug: bool = False,
59
- routes: Optional[List[BaseRoute]] = None,
60
- title: str = "FastAPI",
61
- summary: Optional[str] = None,
62
- description: str = "",
63
- version: str = "0.1.0",
64
- openapi_url: Optional[str] = "/openapi.json",
65
- openapi_tags: Optional[List[Dict[str, Any]]] = None,
66
- servers: Optional[List[Dict[str, Union[str, Any]]]] = None,
67
- dependencies: Optional[Sequence[Depends]] = None,
68
- default_response_class: Type[Response] = Default(JSONResponse),
69
- redirect_slashes: bool = True,
70
- docs_url: Optional[str] = "/docs",
71
- redoc_url: Optional[str] = "/redoc",
72
- swagger_ui_oauth2_redirect_url: Optional[str] = "/docs/oauth2-redirect",
73
- swagger_ui_init_oauth: Optional[Dict[str, Any]] = None,
74
- middleware: Optional[Sequence[Middleware]] = None,
75
- exception_handlers: Optional[
76
- Dict[
77
- Union[int, Type[Exception]],
78
- Callable[[Request, Any], Coroutine[Any, Any, Response]],
79
- ]
80
- ] = None,
81
- on_startup: Optional[Sequence[Callable[[], Any]]] = None,
82
- on_shutdown: Optional[Sequence[Callable[[], Any]]] = None,
83
- lifespan: Optional[Lifespan[AppType]] = None,
84
- terms_of_service: Optional[str] = None,
85
- contact: Optional[Dict[str, Union[str, Any]]] = None,
86
- license_info: Optional[Dict[str, Union[str, Any]]] = None,
87
- openapi_prefix: str = "",
88
- root_path: str = "",
89
- root_path_in_servers: bool = True,
90
- responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
91
- callbacks: Optional[List[BaseRoute]] = None,
92
- webhooks: Optional[routing.APIRouter] = None,
93
- deprecated: Optional[bool] = None,
94
- include_in_schema: bool = True,
95
- swagger_ui_parameters: Optional[Dict[str, Any]] = None,
96
- generate_unique_id_function: Callable[[routing.APIRoute], str] = Default(
97
- generate_unique_id
98
- ),
99
- **extra: Any,
100
- ) -> None:
101
- self.debug = debug
102
- self.title = title
103
- self.summary = summary
104
- self.description = description
105
- self.version = version
106
- self.terms_of_service = terms_of_service
107
- self.contact = contact
108
- self.license_info = license_info
109
- self.openapi_url = openapi_url
110
- self.openapi_tags = openapi_tags
111
- self.root_path_in_servers = root_path_in_servers
112
- self.docs_url = docs_url
113
- self.redoc_url = redoc_url
114
- self.swagger_ui_oauth2_redirect_url = swagger_ui_oauth2_redirect_url
115
- self.swagger_ui_init_oauth = swagger_ui_init_oauth
116
- self.swagger_ui_parameters = swagger_ui_parameters
117
- self.servers = servers or []
118
- self.extra = extra
119
- self.openapi_version = "3.1.0"
120
- self.openapi_schema: Optional[Dict[str, Any]] = None
121
- if self.openapi_url:
122
- assert self.title, "A title must be provided for OpenAPI, e.g.: 'My API'"
123
- assert self.version, "A version must be provided for OpenAPI, e.g.: '2.1.0'"
124
- # TODO: remove when discarding the openapi_prefix parameter
125
- if openapi_prefix:
126
- logger.warning(
127
- '"openapi_prefix" has been deprecated in favor of "root_path", which '
128
- "follows more closely the ASGI standard, is simpler, and more "
129
- "automatic. Check the docs at "
130
- "https://fastapi.tiangolo.com/advanced/sub-applications/"
131
- )
132
- self.webhooks = webhooks or routing.APIRouter()
133
- self.root_path = root_path or openapi_prefix
134
- self.state: State = State()
135
- self.dependency_overrides: Dict[Callable[..., Any], Callable[..., Any]] = {}
136
- self.router: routing.APIRouter = routing.APIRouter(
137
- routes=routes,
138
- redirect_slashes=redirect_slashes,
139
- dependency_overrides_provider=self,
140
- on_startup=on_startup,
141
- on_shutdown=on_shutdown,
142
- lifespan=lifespan,
143
- default_response_class=default_response_class,
144
- dependencies=dependencies,
145
- callbacks=callbacks,
146
- deprecated=deprecated,
147
- include_in_schema=include_in_schema,
148
- responses=responses,
149
- generate_unique_id_function=generate_unique_id_function,
150
- )
151
- self.exception_handlers: Dict[
152
- Any, Callable[[Request, Any], Union[Response, Awaitable[Response]]]
153
- ] = {} if exception_handlers is None else dict(exception_handlers)
154
- self.exception_handlers.setdefault(HTTPException, http_exception_handler)
155
- self.exception_handlers.setdefault(
156
- RequestValidationError, request_validation_exception_handler
157
- )
158
- self.exception_handlers.setdefault(
159
- WebSocketRequestValidationError,
160
- # Starlette still has incorrect type specification for the handlers
161
- websocket_request_validation_exception_handler, # type: ignore
162
- )
163
-
164
- self.user_middleware: List[Middleware] = (
165
- [] if middleware is None else list(middleware)
166
- )
167
- self.middleware_stack: Union[ASGIApp, None] = None
168
- self.setup()
169
-
170
- def build_middleware_stack(self) -> ASGIApp:
171
- # Duplicate/override from prefect._vendor.starlette to add AsyncExitStackMiddleware
172
- # inside of ExceptionMiddleware, inside of custom user middlewares
173
- debug = self.debug
174
- error_handler = None
175
- exception_handlers = {}
176
-
177
- for key, value in self.exception_handlers.items():
178
- if key in (500, Exception):
179
- error_handler = value
180
- else:
181
- exception_handlers[key] = value
182
-
183
- middleware = (
184
- [Middleware(ServerErrorMiddleware, handler=error_handler, debug=debug)]
185
- + self.user_middleware
186
- + [
187
- Middleware(
188
- ExceptionMiddleware, handlers=exception_handlers, debug=debug
189
- ),
190
- # Add FastAPI-specific AsyncExitStackMiddleware for dependencies with
191
- # contextvars.
192
- # This needs to happen after user middlewares because those create a
193
- # new contextvars context copy by using a new AnyIO task group.
194
- # The initial part of dependencies with yield is executed in the
195
- # FastAPI code, inside all the middlewares, but the teardown part
196
- # (after yield) is executed in the AsyncExitStack in this middleware,
197
- # if the AsyncExitStack lived outside of the custom middlewares and
198
- # contextvars were set in a dependency with yield in that internal
199
- # contextvars context, the values would not be available in the
200
- # outside context of the AsyncExitStack.
201
- # By putting the middleware and the AsyncExitStack here, inside all
202
- # user middlewares, the code before and after yield in dependencies
203
- # with yield is executed in the same contextvars context, so all values
204
- # set in contextvars before yield is still available after yield as
205
- # would be expected.
206
- # Additionally, by having this AsyncExitStack here, after the
207
- # ExceptionMiddleware, now dependencies can catch handled exceptions,
208
- # e.g. HTTPException, to customize the teardown code (e.g. DB session
209
- # rollback).
210
- Middleware(AsyncExitStackMiddleware),
211
- ]
212
- )
213
-
214
- app = self.router
215
- for cls, options in reversed(middleware):
216
- app = cls(app=app, **options)
217
- return app
218
-
219
- def openapi(self) -> Dict[str, Any]:
220
- if not self.openapi_schema:
221
- self.openapi_schema = get_openapi(
222
- title=self.title,
223
- version=self.version,
224
- openapi_version=self.openapi_version,
225
- summary=self.summary,
226
- description=self.description,
227
- terms_of_service=self.terms_of_service,
228
- contact=self.contact,
229
- license_info=self.license_info,
230
- routes=self.routes,
231
- webhooks=self.webhooks.routes,
232
- tags=self.openapi_tags,
233
- servers=self.servers,
234
- )
235
- return self.openapi_schema
236
-
237
- def setup(self) -> None:
238
- if self.openapi_url:
239
- urls = (server_data.get("url") for server_data in self.servers)
240
- server_urls = {url for url in urls if url}
241
-
242
- async def openapi(req: Request) -> JSONResponse:
243
- root_path = req.scope.get("root_path", "").rstrip("/")
244
- if root_path not in server_urls:
245
- if root_path and self.root_path_in_servers:
246
- self.servers.insert(0, {"url": root_path})
247
- server_urls.add(root_path)
248
- return JSONResponse(self.openapi())
249
-
250
- self.add_route(self.openapi_url, openapi, include_in_schema=False)
251
- if self.openapi_url and self.docs_url:
252
-
253
- async def swagger_ui_html(req: Request) -> HTMLResponse:
254
- root_path = req.scope.get("root_path", "").rstrip("/")
255
- openapi_url = root_path + self.openapi_url
256
- oauth2_redirect_url = self.swagger_ui_oauth2_redirect_url
257
- if oauth2_redirect_url:
258
- oauth2_redirect_url = root_path + oauth2_redirect_url
259
- return get_swagger_ui_html(
260
- openapi_url=openapi_url,
261
- title=self.title + " - Swagger UI",
262
- oauth2_redirect_url=oauth2_redirect_url,
263
- init_oauth=self.swagger_ui_init_oauth,
264
- swagger_ui_parameters=self.swagger_ui_parameters,
265
- )
266
-
267
- self.add_route(self.docs_url, swagger_ui_html, include_in_schema=False)
268
-
269
- if self.swagger_ui_oauth2_redirect_url:
270
-
271
- async def swagger_ui_redirect(req: Request) -> HTMLResponse:
272
- return get_swagger_ui_oauth2_redirect_html()
273
-
274
- self.add_route(
275
- self.swagger_ui_oauth2_redirect_url,
276
- swagger_ui_redirect,
277
- include_in_schema=False,
278
- )
279
- if self.openapi_url and self.redoc_url:
280
-
281
- async def redoc_html(req: Request) -> HTMLResponse:
282
- root_path = req.scope.get("root_path", "").rstrip("/")
283
- openapi_url = root_path + self.openapi_url
284
- return get_redoc_html(
285
- openapi_url=openapi_url, title=self.title + " - ReDoc"
286
- )
287
-
288
- self.add_route(self.redoc_url, redoc_html, include_in_schema=False)
289
-
290
- async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
291
- if self.root_path:
292
- scope["root_path"] = self.root_path
293
- await super().__call__(scope, receive, send)
294
-
295
- def add_api_route(
296
- self,
297
- path: str,
298
- endpoint: Callable[..., Coroutine[Any, Any, Response]],
299
- *,
300
- response_model: Any = Default(None),
301
- status_code: Optional[int] = None,
302
- tags: Optional[List[Union[str, Enum]]] = None,
303
- dependencies: Optional[Sequence[Depends]] = None,
304
- summary: Optional[str] = None,
305
- description: Optional[str] = None,
306
- response_description: str = "Successful Response",
307
- responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
308
- deprecated: Optional[bool] = None,
309
- methods: Optional[List[str]] = None,
310
- operation_id: Optional[str] = None,
311
- response_model_include: Optional[Union[SetIntStr, DictIntStrAny]] = None,
312
- response_model_exclude: Optional[Union[SetIntStr, DictIntStrAny]] = None,
313
- response_model_by_alias: bool = True,
314
- response_model_exclude_unset: bool = False,
315
- response_model_exclude_defaults: bool = False,
316
- response_model_exclude_none: bool = False,
317
- include_in_schema: bool = True,
318
- response_class: Union[Type[Response], DefaultPlaceholder] = Default(
319
- JSONResponse
320
- ),
321
- name: Optional[str] = None,
322
- openapi_extra: Optional[Dict[str, Any]] = None,
323
- generate_unique_id_function: Callable[[routing.APIRoute], str] = Default(
324
- generate_unique_id
325
- ),
326
- ) -> None:
327
- self.router.add_api_route(
328
- path,
329
- endpoint=endpoint,
330
- response_model=response_model,
331
- status_code=status_code,
332
- tags=tags,
333
- dependencies=dependencies,
334
- summary=summary,
335
- description=description,
336
- response_description=response_description,
337
- responses=responses,
338
- deprecated=deprecated,
339
- methods=methods,
340
- operation_id=operation_id,
341
- response_model_include=response_model_include,
342
- response_model_exclude=response_model_exclude,
343
- response_model_by_alias=response_model_by_alias,
344
- response_model_exclude_unset=response_model_exclude_unset,
345
- response_model_exclude_defaults=response_model_exclude_defaults,
346
- response_model_exclude_none=response_model_exclude_none,
347
- include_in_schema=include_in_schema,
348
- response_class=response_class,
349
- name=name,
350
- openapi_extra=openapi_extra,
351
- generate_unique_id_function=generate_unique_id_function,
352
- )
353
-
354
- def api_route(
355
- self,
356
- path: str,
357
- *,
358
- response_model: Any = Default(None),
359
- status_code: Optional[int] = None,
360
- tags: Optional[List[Union[str, Enum]]] = None,
361
- dependencies: Optional[Sequence[Depends]] = None,
362
- summary: Optional[str] = None,
363
- description: Optional[str] = None,
364
- response_description: str = "Successful Response",
365
- responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
366
- deprecated: Optional[bool] = None,
367
- methods: Optional[List[str]] = None,
368
- operation_id: Optional[str] = None,
369
- response_model_include: Optional[Union[SetIntStr, DictIntStrAny]] = None,
370
- response_model_exclude: Optional[Union[SetIntStr, DictIntStrAny]] = None,
371
- response_model_by_alias: bool = True,
372
- response_model_exclude_unset: bool = False,
373
- response_model_exclude_defaults: bool = False,
374
- response_model_exclude_none: bool = False,
375
- include_in_schema: bool = True,
376
- response_class: Type[Response] = Default(JSONResponse),
377
- name: Optional[str] = None,
378
- openapi_extra: Optional[Dict[str, Any]] = None,
379
- generate_unique_id_function: Callable[[routing.APIRoute], str] = Default(
380
- generate_unique_id
381
- ),
382
- ) -> Callable[[DecoratedCallable], DecoratedCallable]:
383
- def decorator(func: DecoratedCallable) -> DecoratedCallable:
384
- self.router.add_api_route(
385
- path,
386
- func,
387
- response_model=response_model,
388
- status_code=status_code,
389
- tags=tags,
390
- dependencies=dependencies,
391
- summary=summary,
392
- description=description,
393
- response_description=response_description,
394
- responses=responses,
395
- deprecated=deprecated,
396
- methods=methods,
397
- operation_id=operation_id,
398
- response_model_include=response_model_include,
399
- response_model_exclude=response_model_exclude,
400
- response_model_by_alias=response_model_by_alias,
401
- response_model_exclude_unset=response_model_exclude_unset,
402
- response_model_exclude_defaults=response_model_exclude_defaults,
403
- response_model_exclude_none=response_model_exclude_none,
404
- include_in_schema=include_in_schema,
405
- response_class=response_class,
406
- name=name,
407
- openapi_extra=openapi_extra,
408
- generate_unique_id_function=generate_unique_id_function,
409
- )
410
- return func
411
-
412
- return decorator
413
-
414
- def add_api_websocket_route(
415
- self,
416
- path: str,
417
- endpoint: Callable[..., Any],
418
- name: Optional[str] = None,
419
- *,
420
- dependencies: Optional[Sequence[Depends]] = None,
421
- ) -> None:
422
- self.router.add_api_websocket_route(
423
- path,
424
- endpoint,
425
- name=name,
426
- dependencies=dependencies,
427
- )
428
-
429
- def websocket(
430
- self,
431
- path: str,
432
- name: Optional[str] = None,
433
- *,
434
- dependencies: Optional[Sequence[Depends]] = None,
435
- ) -> Callable[[DecoratedCallable], DecoratedCallable]:
436
- def decorator(func: DecoratedCallable) -> DecoratedCallable:
437
- self.add_api_websocket_route(
438
- path,
439
- func,
440
- name=name,
441
- dependencies=dependencies,
442
- )
443
- return func
444
-
445
- return decorator
446
-
447
- def include_router(
448
- self,
449
- router: routing.APIRouter,
450
- *,
451
- prefix: str = "",
452
- tags: Optional[List[Union[str, Enum]]] = None,
453
- dependencies: Optional[Sequence[Depends]] = None,
454
- responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
455
- deprecated: Optional[bool] = None,
456
- include_in_schema: bool = True,
457
- default_response_class: Type[Response] = Default(JSONResponse),
458
- callbacks: Optional[List[BaseRoute]] = None,
459
- generate_unique_id_function: Callable[[routing.APIRoute], str] = Default(
460
- generate_unique_id
461
- ),
462
- ) -> None:
463
- self.router.include_router(
464
- router,
465
- prefix=prefix,
466
- tags=tags,
467
- dependencies=dependencies,
468
- responses=responses,
469
- deprecated=deprecated,
470
- include_in_schema=include_in_schema,
471
- default_response_class=default_response_class,
472
- callbacks=callbacks,
473
- generate_unique_id_function=generate_unique_id_function,
474
- )
475
-
476
- def get(
477
- self,
478
- path: str,
479
- *,
480
- response_model: Any = Default(None),
481
- status_code: Optional[int] = None,
482
- tags: Optional[List[Union[str, Enum]]] = None,
483
- dependencies: Optional[Sequence[Depends]] = None,
484
- summary: Optional[str] = None,
485
- description: Optional[str] = None,
486
- response_description: str = "Successful Response",
487
- responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
488
- deprecated: Optional[bool] = None,
489
- operation_id: Optional[str] = None,
490
- response_model_include: Optional[Union[SetIntStr, DictIntStrAny]] = None,
491
- response_model_exclude: Optional[Union[SetIntStr, DictIntStrAny]] = None,
492
- response_model_by_alias: bool = True,
493
- response_model_exclude_unset: bool = False,
494
- response_model_exclude_defaults: bool = False,
495
- response_model_exclude_none: bool = False,
496
- include_in_schema: bool = True,
497
- response_class: Type[Response] = Default(JSONResponse),
498
- name: Optional[str] = None,
499
- callbacks: Optional[List[BaseRoute]] = None,
500
- openapi_extra: Optional[Dict[str, Any]] = None,
501
- generate_unique_id_function: Callable[[routing.APIRoute], str] = Default(
502
- generate_unique_id
503
- ),
504
- ) -> Callable[[DecoratedCallable], DecoratedCallable]:
505
- return self.router.get(
506
- path,
507
- response_model=response_model,
508
- status_code=status_code,
509
- tags=tags,
510
- dependencies=dependencies,
511
- summary=summary,
512
- description=description,
513
- response_description=response_description,
514
- responses=responses,
515
- deprecated=deprecated,
516
- operation_id=operation_id,
517
- response_model_include=response_model_include,
518
- response_model_exclude=response_model_exclude,
519
- response_model_by_alias=response_model_by_alias,
520
- response_model_exclude_unset=response_model_exclude_unset,
521
- response_model_exclude_defaults=response_model_exclude_defaults,
522
- response_model_exclude_none=response_model_exclude_none,
523
- include_in_schema=include_in_schema,
524
- response_class=response_class,
525
- name=name,
526
- callbacks=callbacks,
527
- openapi_extra=openapi_extra,
528
- generate_unique_id_function=generate_unique_id_function,
529
- )
530
-
531
- def put(
532
- self,
533
- path: str,
534
- *,
535
- response_model: Any = Default(None),
536
- status_code: Optional[int] = None,
537
- tags: Optional[List[Union[str, Enum]]] = None,
538
- dependencies: Optional[Sequence[Depends]] = None,
539
- summary: Optional[str] = None,
540
- description: Optional[str] = None,
541
- response_description: str = "Successful Response",
542
- responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
543
- deprecated: Optional[bool] = None,
544
- operation_id: Optional[str] = None,
545
- response_model_include: Optional[Union[SetIntStr, DictIntStrAny]] = None,
546
- response_model_exclude: Optional[Union[SetIntStr, DictIntStrAny]] = None,
547
- response_model_by_alias: bool = True,
548
- response_model_exclude_unset: bool = False,
549
- response_model_exclude_defaults: bool = False,
550
- response_model_exclude_none: bool = False,
551
- include_in_schema: bool = True,
552
- response_class: Type[Response] = Default(JSONResponse),
553
- name: Optional[str] = None,
554
- callbacks: Optional[List[BaseRoute]] = None,
555
- openapi_extra: Optional[Dict[str, Any]] = None,
556
- generate_unique_id_function: Callable[[routing.APIRoute], str] = Default(
557
- generate_unique_id
558
- ),
559
- ) -> Callable[[DecoratedCallable], DecoratedCallable]:
560
- return self.router.put(
561
- path,
562
- response_model=response_model,
563
- status_code=status_code,
564
- tags=tags,
565
- dependencies=dependencies,
566
- summary=summary,
567
- description=description,
568
- response_description=response_description,
569
- responses=responses,
570
- deprecated=deprecated,
571
- operation_id=operation_id,
572
- response_model_include=response_model_include,
573
- response_model_exclude=response_model_exclude,
574
- response_model_by_alias=response_model_by_alias,
575
- response_model_exclude_unset=response_model_exclude_unset,
576
- response_model_exclude_defaults=response_model_exclude_defaults,
577
- response_model_exclude_none=response_model_exclude_none,
578
- include_in_schema=include_in_schema,
579
- response_class=response_class,
580
- name=name,
581
- callbacks=callbacks,
582
- openapi_extra=openapi_extra,
583
- generate_unique_id_function=generate_unique_id_function,
584
- )
585
-
586
- def post(
587
- self,
588
- path: str,
589
- *,
590
- response_model: Any = Default(None),
591
- status_code: Optional[int] = None,
592
- tags: Optional[List[Union[str, Enum]]] = None,
593
- dependencies: Optional[Sequence[Depends]] = None,
594
- summary: Optional[str] = None,
595
- description: Optional[str] = None,
596
- response_description: str = "Successful Response",
597
- responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
598
- deprecated: Optional[bool] = None,
599
- operation_id: Optional[str] = None,
600
- response_model_include: Optional[Union[SetIntStr, DictIntStrAny]] = None,
601
- response_model_exclude: Optional[Union[SetIntStr, DictIntStrAny]] = None,
602
- response_model_by_alias: bool = True,
603
- response_model_exclude_unset: bool = False,
604
- response_model_exclude_defaults: bool = False,
605
- response_model_exclude_none: bool = False,
606
- include_in_schema: bool = True,
607
- response_class: Type[Response] = Default(JSONResponse),
608
- name: Optional[str] = None,
609
- callbacks: Optional[List[BaseRoute]] = None,
610
- openapi_extra: Optional[Dict[str, Any]] = None,
611
- generate_unique_id_function: Callable[[routing.APIRoute], str] = Default(
612
- generate_unique_id
613
- ),
614
- ) -> Callable[[DecoratedCallable], DecoratedCallable]:
615
- return self.router.post(
616
- path,
617
- response_model=response_model,
618
- status_code=status_code,
619
- tags=tags,
620
- dependencies=dependencies,
621
- summary=summary,
622
- description=description,
623
- response_description=response_description,
624
- responses=responses,
625
- deprecated=deprecated,
626
- operation_id=operation_id,
627
- response_model_include=response_model_include,
628
- response_model_exclude=response_model_exclude,
629
- response_model_by_alias=response_model_by_alias,
630
- response_model_exclude_unset=response_model_exclude_unset,
631
- response_model_exclude_defaults=response_model_exclude_defaults,
632
- response_model_exclude_none=response_model_exclude_none,
633
- include_in_schema=include_in_schema,
634
- response_class=response_class,
635
- name=name,
636
- callbacks=callbacks,
637
- openapi_extra=openapi_extra,
638
- generate_unique_id_function=generate_unique_id_function,
639
- )
640
-
641
- def delete(
642
- self,
643
- path: str,
644
- *,
645
- response_model: Any = Default(None),
646
- status_code: Optional[int] = None,
647
- tags: Optional[List[Union[str, Enum]]] = None,
648
- dependencies: Optional[Sequence[Depends]] = None,
649
- summary: Optional[str] = None,
650
- description: Optional[str] = None,
651
- response_description: str = "Successful Response",
652
- responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
653
- deprecated: Optional[bool] = None,
654
- operation_id: Optional[str] = None,
655
- response_model_include: Optional[Union[SetIntStr, DictIntStrAny]] = None,
656
- response_model_exclude: Optional[Union[SetIntStr, DictIntStrAny]] = None,
657
- response_model_by_alias: bool = True,
658
- response_model_exclude_unset: bool = False,
659
- response_model_exclude_defaults: bool = False,
660
- response_model_exclude_none: bool = False,
661
- include_in_schema: bool = True,
662
- response_class: Type[Response] = Default(JSONResponse),
663
- name: Optional[str] = None,
664
- callbacks: Optional[List[BaseRoute]] = None,
665
- openapi_extra: Optional[Dict[str, Any]] = None,
666
- generate_unique_id_function: Callable[[routing.APIRoute], str] = Default(
667
- generate_unique_id
668
- ),
669
- ) -> Callable[[DecoratedCallable], DecoratedCallable]:
670
- return self.router.delete(
671
- path,
672
- response_model=response_model,
673
- status_code=status_code,
674
- tags=tags,
675
- dependencies=dependencies,
676
- summary=summary,
677
- description=description,
678
- response_description=response_description,
679
- responses=responses,
680
- deprecated=deprecated,
681
- operation_id=operation_id,
682
- response_model_include=response_model_include,
683
- response_model_exclude=response_model_exclude,
684
- response_model_by_alias=response_model_by_alias,
685
- response_model_exclude_unset=response_model_exclude_unset,
686
- response_model_exclude_defaults=response_model_exclude_defaults,
687
- response_model_exclude_none=response_model_exclude_none,
688
- include_in_schema=include_in_schema,
689
- response_class=response_class,
690
- name=name,
691
- callbacks=callbacks,
692
- openapi_extra=openapi_extra,
693
- generate_unique_id_function=generate_unique_id_function,
694
- )
695
-
696
- def options(
697
- self,
698
- path: str,
699
- *,
700
- response_model: Any = Default(None),
701
- status_code: Optional[int] = None,
702
- tags: Optional[List[Union[str, Enum]]] = None,
703
- dependencies: Optional[Sequence[Depends]] = None,
704
- summary: Optional[str] = None,
705
- description: Optional[str] = None,
706
- response_description: str = "Successful Response",
707
- responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
708
- deprecated: Optional[bool] = None,
709
- operation_id: Optional[str] = None,
710
- response_model_include: Optional[Union[SetIntStr, DictIntStrAny]] = None,
711
- response_model_exclude: Optional[Union[SetIntStr, DictIntStrAny]] = None,
712
- response_model_by_alias: bool = True,
713
- response_model_exclude_unset: bool = False,
714
- response_model_exclude_defaults: bool = False,
715
- response_model_exclude_none: bool = False,
716
- include_in_schema: bool = True,
717
- response_class: Type[Response] = Default(JSONResponse),
718
- name: Optional[str] = None,
719
- callbacks: Optional[List[BaseRoute]] = None,
720
- openapi_extra: Optional[Dict[str, Any]] = None,
721
- generate_unique_id_function: Callable[[routing.APIRoute], str] = Default(
722
- generate_unique_id
723
- ),
724
- ) -> Callable[[DecoratedCallable], DecoratedCallable]:
725
- return self.router.options(
726
- path,
727
- response_model=response_model,
728
- status_code=status_code,
729
- tags=tags,
730
- dependencies=dependencies,
731
- summary=summary,
732
- description=description,
733
- response_description=response_description,
734
- responses=responses,
735
- deprecated=deprecated,
736
- operation_id=operation_id,
737
- response_model_include=response_model_include,
738
- response_model_exclude=response_model_exclude,
739
- response_model_by_alias=response_model_by_alias,
740
- response_model_exclude_unset=response_model_exclude_unset,
741
- response_model_exclude_defaults=response_model_exclude_defaults,
742
- response_model_exclude_none=response_model_exclude_none,
743
- include_in_schema=include_in_schema,
744
- response_class=response_class,
745
- name=name,
746
- callbacks=callbacks,
747
- openapi_extra=openapi_extra,
748
- generate_unique_id_function=generate_unique_id_function,
749
- )
750
-
751
- def head(
752
- self,
753
- path: str,
754
- *,
755
- response_model: Any = Default(None),
756
- status_code: Optional[int] = None,
757
- tags: Optional[List[Union[str, Enum]]] = None,
758
- dependencies: Optional[Sequence[Depends]] = None,
759
- summary: Optional[str] = None,
760
- description: Optional[str] = None,
761
- response_description: str = "Successful Response",
762
- responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
763
- deprecated: Optional[bool] = None,
764
- operation_id: Optional[str] = None,
765
- response_model_include: Optional[Union[SetIntStr, DictIntStrAny]] = None,
766
- response_model_exclude: Optional[Union[SetIntStr, DictIntStrAny]] = None,
767
- response_model_by_alias: bool = True,
768
- response_model_exclude_unset: bool = False,
769
- response_model_exclude_defaults: bool = False,
770
- response_model_exclude_none: bool = False,
771
- include_in_schema: bool = True,
772
- response_class: Type[Response] = Default(JSONResponse),
773
- name: Optional[str] = None,
774
- callbacks: Optional[List[BaseRoute]] = None,
775
- openapi_extra: Optional[Dict[str, Any]] = None,
776
- generate_unique_id_function: Callable[[routing.APIRoute], str] = Default(
777
- generate_unique_id
778
- ),
779
- ) -> Callable[[DecoratedCallable], DecoratedCallable]:
780
- return self.router.head(
781
- path,
782
- response_model=response_model,
783
- status_code=status_code,
784
- tags=tags,
785
- dependencies=dependencies,
786
- summary=summary,
787
- description=description,
788
- response_description=response_description,
789
- responses=responses,
790
- deprecated=deprecated,
791
- operation_id=operation_id,
792
- response_model_include=response_model_include,
793
- response_model_exclude=response_model_exclude,
794
- response_model_by_alias=response_model_by_alias,
795
- response_model_exclude_unset=response_model_exclude_unset,
796
- response_model_exclude_defaults=response_model_exclude_defaults,
797
- response_model_exclude_none=response_model_exclude_none,
798
- include_in_schema=include_in_schema,
799
- response_class=response_class,
800
- name=name,
801
- callbacks=callbacks,
802
- openapi_extra=openapi_extra,
803
- generate_unique_id_function=generate_unique_id_function,
804
- )
805
-
806
- def patch(
807
- self,
808
- path: str,
809
- *,
810
- response_model: Any = Default(None),
811
- status_code: Optional[int] = None,
812
- tags: Optional[List[Union[str, Enum]]] = None,
813
- dependencies: Optional[Sequence[Depends]] = None,
814
- summary: Optional[str] = None,
815
- description: Optional[str] = None,
816
- response_description: str = "Successful Response",
817
- responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
818
- deprecated: Optional[bool] = None,
819
- operation_id: Optional[str] = None,
820
- response_model_include: Optional[Union[SetIntStr, DictIntStrAny]] = None,
821
- response_model_exclude: Optional[Union[SetIntStr, DictIntStrAny]] = None,
822
- response_model_by_alias: bool = True,
823
- response_model_exclude_unset: bool = False,
824
- response_model_exclude_defaults: bool = False,
825
- response_model_exclude_none: bool = False,
826
- include_in_schema: bool = True,
827
- response_class: Type[Response] = Default(JSONResponse),
828
- name: Optional[str] = None,
829
- callbacks: Optional[List[BaseRoute]] = None,
830
- openapi_extra: Optional[Dict[str, Any]] = None,
831
- generate_unique_id_function: Callable[[routing.APIRoute], str] = Default(
832
- generate_unique_id
833
- ),
834
- ) -> Callable[[DecoratedCallable], DecoratedCallable]:
835
- return self.router.patch(
836
- path,
837
- response_model=response_model,
838
- status_code=status_code,
839
- tags=tags,
840
- dependencies=dependencies,
841
- summary=summary,
842
- description=description,
843
- response_description=response_description,
844
- responses=responses,
845
- deprecated=deprecated,
846
- operation_id=operation_id,
847
- response_model_include=response_model_include,
848
- response_model_exclude=response_model_exclude,
849
- response_model_by_alias=response_model_by_alias,
850
- response_model_exclude_unset=response_model_exclude_unset,
851
- response_model_exclude_defaults=response_model_exclude_defaults,
852
- response_model_exclude_none=response_model_exclude_none,
853
- include_in_schema=include_in_schema,
854
- response_class=response_class,
855
- name=name,
856
- callbacks=callbacks,
857
- openapi_extra=openapi_extra,
858
- generate_unique_id_function=generate_unique_id_function,
859
- )
860
-
861
- def trace(
862
- self,
863
- path: str,
864
- *,
865
- response_model: Any = Default(None),
866
- status_code: Optional[int] = None,
867
- tags: Optional[List[Union[str, Enum]]] = None,
868
- dependencies: Optional[Sequence[Depends]] = None,
869
- summary: Optional[str] = None,
870
- description: Optional[str] = None,
871
- response_description: str = "Successful Response",
872
- responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
873
- deprecated: Optional[bool] = None,
874
- operation_id: Optional[str] = None,
875
- response_model_include: Optional[Union[SetIntStr, DictIntStrAny]] = None,
876
- response_model_exclude: Optional[Union[SetIntStr, DictIntStrAny]] = None,
877
- response_model_by_alias: bool = True,
878
- response_model_exclude_unset: bool = False,
879
- response_model_exclude_defaults: bool = False,
880
- response_model_exclude_none: bool = False,
881
- include_in_schema: bool = True,
882
- response_class: Type[Response] = Default(JSONResponse),
883
- name: Optional[str] = None,
884
- callbacks: Optional[List[BaseRoute]] = None,
885
- openapi_extra: Optional[Dict[str, Any]] = None,
886
- generate_unique_id_function: Callable[[routing.APIRoute], str] = Default(
887
- generate_unique_id
888
- ),
889
- ) -> Callable[[DecoratedCallable], DecoratedCallable]:
890
- return self.router.trace(
891
- path,
892
- response_model=response_model,
893
- status_code=status_code,
894
- tags=tags,
895
- dependencies=dependencies,
896
- summary=summary,
897
- description=description,
898
- response_description=response_description,
899
- responses=responses,
900
- deprecated=deprecated,
901
- operation_id=operation_id,
902
- response_model_include=response_model_include,
903
- response_model_exclude=response_model_exclude,
904
- response_model_by_alias=response_model_by_alias,
905
- response_model_exclude_unset=response_model_exclude_unset,
906
- response_model_exclude_defaults=response_model_exclude_defaults,
907
- response_model_exclude_none=response_model_exclude_none,
908
- include_in_schema=include_in_schema,
909
- response_class=response_class,
910
- name=name,
911
- callbacks=callbacks,
912
- openapi_extra=openapi_extra,
913
- generate_unique_id_function=generate_unique_id_function,
914
- )
915
-
916
- def websocket_route(
917
- self, path: str, name: Union[str, None] = None
918
- ) -> Callable[[DecoratedCallable], DecoratedCallable]:
919
- def decorator(func: DecoratedCallable) -> DecoratedCallable:
920
- self.router.add_websocket_route(path, func, name=name)
921
- return func
922
-
923
- return decorator
924
-
925
- def on_event(
926
- self, event_type: str
927
- ) -> Callable[[DecoratedCallable], DecoratedCallable]:
928
- return self.router.on_event(event_type)
929
-
930
- def middleware(
931
- self, middleware_type: str
932
- ) -> Callable[[DecoratedCallable], DecoratedCallable]:
933
- def decorator(func: DecoratedCallable) -> DecoratedCallable:
934
- self.add_middleware(BaseHTTPMiddleware, dispatch=func)
935
- return func
936
-
937
- return decorator
938
-
939
- def exception_handler(
940
- self, exc_class_or_status_code: Union[int, Type[Exception]]
941
- ) -> Callable[[DecoratedCallable], DecoratedCallable]:
942
- def decorator(func: DecoratedCallable) -> DecoratedCallable:
943
- self.add_exception_handler(exc_class_or_status_code, func)
944
- return func
945
-
946
- return decorator