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,231 +0,0 @@
1
- import typing
2
- import warnings
3
- from os import PathLike
4
-
5
- from prefect._vendor.starlette.background import BackgroundTask
6
- from prefect._vendor.starlette.datastructures import URL
7
- from prefect._vendor.starlette.requests import Request
8
- from prefect._vendor.starlette.responses import HTMLResponse
9
- from prefect._vendor.starlette.types import Receive, Scope, Send
10
-
11
- try:
12
- import jinja2
13
-
14
- # @contextfunction was renamed to @pass_context in Jinja 3.0, and was removed in 3.1
15
- # hence we try to get pass_context (most installs will be >=3.1)
16
- # and fall back to contextfunction,
17
- # adding a type ignore for mypy to let us access an attribute that may not exist
18
- if hasattr(jinja2, "pass_context"):
19
- pass_context = jinja2.pass_context
20
- else: # pragma: nocover
21
- pass_context = jinja2.contextfunction # type: ignore[attr-defined]
22
- except ModuleNotFoundError: # pragma: nocover
23
- jinja2 = None # type: ignore[assignment]
24
-
25
-
26
- class _TemplateResponse(HTMLResponse):
27
- def __init__(
28
- self,
29
- template: typing.Any,
30
- context: typing.Dict[str, typing.Any],
31
- status_code: int = 200,
32
- headers: typing.Optional[typing.Mapping[str, str]] = None,
33
- media_type: typing.Optional[str] = None,
34
- background: typing.Optional[BackgroundTask] = None,
35
- ):
36
- self.template = template
37
- self.context = context
38
- content = template.render(context)
39
- super().__init__(content, status_code, headers, media_type, background)
40
-
41
- async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
42
- request = self.context.get("request", {})
43
- extensions = request.get("extensions", {})
44
- if "http.response.debug" in extensions:
45
- await send(
46
- {
47
- "type": "http.response.debug",
48
- "info": {
49
- "template": self.template,
50
- "context": self.context,
51
- },
52
- }
53
- )
54
- await super().__call__(scope, receive, send)
55
-
56
-
57
- class Jinja2Templates:
58
- """
59
- templates = Jinja2Templates("templates")
60
-
61
- return templates.TemplateResponse("index.html", {"request": request})
62
- """
63
-
64
- @typing.overload
65
- def __init__(
66
- self,
67
- directory: "typing.Union[str, PathLike[typing.AnyStr], typing.Sequence[typing.Union[str, PathLike[typing.AnyStr]]]]", # noqa: E501
68
- *,
69
- context_processors: typing.Optional[
70
- typing.List[typing.Callable[[Request], typing.Dict[str, typing.Any]]]
71
- ] = None,
72
- **env_options: typing.Any,
73
- ) -> None:
74
- ...
75
-
76
- @typing.overload
77
- def __init__(
78
- self,
79
- *,
80
- env: "jinja2.Environment",
81
- context_processors: typing.Optional[
82
- typing.List[typing.Callable[[Request], typing.Dict[str, typing.Any]]]
83
- ] = None,
84
- ) -> None:
85
- ...
86
-
87
- def __init__(
88
- self,
89
- directory: "typing.Union[str, PathLike[typing.AnyStr], typing.Sequence[typing.Union[str, PathLike[typing.AnyStr]]], None]" = None, # noqa: E501
90
- *,
91
- context_processors: typing.Optional[
92
- typing.List[typing.Callable[[Request], typing.Dict[str, typing.Any]]]
93
- ] = None,
94
- env: typing.Optional["jinja2.Environment"] = None,
95
- **env_options: typing.Any,
96
- ) -> None:
97
- if env_options:
98
- warnings.warn(
99
- "Extra environment options are deprecated. Use a preconfigured jinja2.Environment instead.", # noqa: E501
100
- DeprecationWarning,
101
- )
102
- assert jinja2 is not None, "jinja2 must be installed to use Jinja2Templates"
103
- assert directory or env, "either 'directory' or 'env' arguments must be passed"
104
- self.context_processors = context_processors or []
105
- if directory is not None:
106
- self.env = self._create_env(directory, **env_options)
107
- elif env is not None:
108
- self.env = env
109
-
110
- self._setup_env_defaults(self.env)
111
-
112
- def _create_env(
113
- self,
114
- directory: "typing.Union[str, PathLike[typing.AnyStr], typing.Sequence[typing.Union[str, PathLike[typing.AnyStr]]]]", # noqa: E501
115
- **env_options: typing.Any,
116
- ) -> "jinja2.Environment":
117
- loader = jinja2.FileSystemLoader(directory)
118
- env_options.setdefault("loader", loader)
119
- env_options.setdefault("autoescape", True)
120
-
121
- return jinja2.Environment(**env_options)
122
-
123
- def _setup_env_defaults(self, env: "jinja2.Environment") -> None:
124
- @pass_context
125
- def url_for(
126
- context: typing.Dict[str, typing.Any],
127
- name: str,
128
- /,
129
- **path_params: typing.Any,
130
- ) -> URL:
131
- request: Request = context["request"]
132
- return request.url_for(name, **path_params)
133
-
134
- env.globals.setdefault("url_for", url_for)
135
-
136
- def get_template(self, name: str) -> "jinja2.Template":
137
- return self.env.get_template(name)
138
-
139
- @typing.overload
140
- def TemplateResponse(
141
- self,
142
- request: Request,
143
- name: str,
144
- context: typing.Optional[typing.Dict[str, typing.Any]] = None,
145
- status_code: int = 200,
146
- headers: typing.Optional[typing.Mapping[str, str]] = None,
147
- media_type: typing.Optional[str] = None,
148
- background: typing.Optional[BackgroundTask] = None,
149
- ) -> _TemplateResponse:
150
- ...
151
-
152
- @typing.overload
153
- def TemplateResponse(
154
- self,
155
- name: str,
156
- context: typing.Optional[typing.Dict[str, typing.Any]] = None,
157
- status_code: int = 200,
158
- headers: typing.Optional[typing.Mapping[str, str]] = None,
159
- media_type: typing.Optional[str] = None,
160
- background: typing.Optional[BackgroundTask] = None,
161
- ) -> _TemplateResponse:
162
- # Deprecated usage
163
- ...
164
-
165
- def TemplateResponse(
166
- self, *args: typing.Any, **kwargs: typing.Any
167
- ) -> _TemplateResponse:
168
- if args:
169
- if isinstance(
170
- args[0], str
171
- ): # the first argument is template name (old style)
172
- warnings.warn(
173
- "The `name` is not the first parameter anymore. "
174
- "The first parameter should be the `Request` instance.\n"
175
- 'Replace `TemplateResponse(name, {"request": request})` by `TemplateResponse(request, name)`.', # noqa: E501
176
- DeprecationWarning,
177
- )
178
-
179
- name = args[0]
180
- context = args[1] if len(args) > 1 else kwargs.get("context", {})
181
- status_code = (
182
- args[2] if len(args) > 2 else kwargs.get("status_code", 200)
183
- )
184
- headers = args[2] if len(args) > 2 else kwargs.get("headers")
185
- media_type = args[3] if len(args) > 3 else kwargs.get("media_type")
186
- background = args[4] if len(args) > 4 else kwargs.get("background")
187
-
188
- if "request" not in context:
189
- raise ValueError('context must include a "request" key')
190
- request = context["request"]
191
- else: # the first argument is a request instance (new style)
192
- request = args[0]
193
- name = args[1] if len(args) > 1 else kwargs["name"]
194
- context = args[2] if len(args) > 2 else kwargs.get("context", {})
195
- status_code = (
196
- args[3] if len(args) > 3 else kwargs.get("status_code", 200)
197
- )
198
- headers = args[4] if len(args) > 4 else kwargs.get("headers")
199
- media_type = args[5] if len(args) > 5 else kwargs.get("media_type")
200
- background = args[6] if len(args) > 6 else kwargs.get("background")
201
- else: # all arguments are kwargs
202
- if "request" not in kwargs:
203
- warnings.warn(
204
- "The `TemplateResponse` now requires the `request` argument.\n"
205
- 'Replace `TemplateResponse(name, {"context": context})` by `TemplateResponse(request, name)`.', # noqa: E501
206
- DeprecationWarning,
207
- )
208
- if "request" not in kwargs.get("context", {}):
209
- raise ValueError('context must include a "request" key')
210
-
211
- context = kwargs.get("context", {})
212
- request = kwargs.get("request", context.get("request"))
213
- name = typing.cast(str, kwargs["name"])
214
- status_code = kwargs.get("status_code", 200)
215
- headers = kwargs.get("headers")
216
- media_type = kwargs.get("media_type")
217
- background = kwargs.get("background")
218
-
219
- context.setdefault("request", request)
220
- for context_processor in self.context_processors:
221
- context.update(context_processor(request))
222
-
223
- template = self.get_template(name)
224
- return _TemplateResponse(
225
- template,
226
- context,
227
- status_code=status_code,
228
- headers=headers,
229
- media_type=media_type,
230
- background=background,
231
- )