fastapi 0.116.1__py3-none-any.whl → 0.117.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.
Potentially problematic release.
This version of fastapi might be problematic. Click here for more details.
- fastapi/__init__.py +1 -1
- fastapi/_compat.py +2 -1
- fastapi/applications.py +28 -0
- fastapi/dependencies/utils.py +17 -5
- fastapi/encoders.py +2 -1
- fastapi/exception_handlers.py +2 -2
- fastapi/openapi/models.py +8 -2
- fastapi/openapi/utils.py +4 -2
- fastapi/routing.py +8 -2
- fastapi/security/api_key.py +3 -3
- fastapi/utils.py +1 -0
- {fastapi-0.116.1.dist-info → fastapi-0.117.0.dist-info}/METADATA +9 -9
- {fastapi-0.116.1.dist-info → fastapi-0.117.0.dist-info}/RECORD +16 -16
- {fastapi-0.116.1.dist-info → fastapi-0.117.0.dist-info}/WHEEL +0 -0
- {fastapi-0.116.1.dist-info → fastapi-0.117.0.dist-info}/entry_points.txt +0 -0
- {fastapi-0.116.1.dist-info → fastapi-0.117.0.dist-info}/licenses/LICENSE +0 -0
fastapi/__init__.py
CHANGED
fastapi/_compat.py
CHANGED
|
@@ -393,9 +393,10 @@ else:
|
|
|
393
393
|
)
|
|
394
394
|
definitions.update(m_definitions)
|
|
395
395
|
model_name = model_name_map[model]
|
|
396
|
+
definitions[model_name] = m_schema
|
|
397
|
+
for m_schema in definitions.values():
|
|
396
398
|
if "description" in m_schema:
|
|
397
399
|
m_schema["description"] = m_schema["description"].split("\f")[0]
|
|
398
|
-
definitions[model_name] = m_schema
|
|
399
400
|
return definitions
|
|
400
401
|
|
|
401
402
|
def is_pv1_scalar_field(field: ModelField) -> bool:
|
fastapi/applications.py
CHANGED
|
@@ -810,6 +810,32 @@ class FastAPI(Starlette):
|
|
|
810
810
|
"""
|
|
811
811
|
),
|
|
812
812
|
] = True,
|
|
813
|
+
openapi_external_docs: Annotated[
|
|
814
|
+
Optional[Dict[str, Any]],
|
|
815
|
+
Doc(
|
|
816
|
+
"""
|
|
817
|
+
This field allows you to provide additional external documentation links.
|
|
818
|
+
If provided, it must be a dictionary containing:
|
|
819
|
+
|
|
820
|
+
* `description`: A brief description of the external documentation.
|
|
821
|
+
* `url`: The URL pointing to the external documentation. The value **MUST**
|
|
822
|
+
be a valid URL format.
|
|
823
|
+
|
|
824
|
+
**Example**:
|
|
825
|
+
|
|
826
|
+
```python
|
|
827
|
+
from fastapi import FastAPI
|
|
828
|
+
|
|
829
|
+
external_docs = {
|
|
830
|
+
"description": "Detailed API Reference",
|
|
831
|
+
"url": "https://example.com/api-docs",
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
app = FastAPI(openapi_external_docs=external_docs)
|
|
835
|
+
```
|
|
836
|
+
"""
|
|
837
|
+
),
|
|
838
|
+
] = None,
|
|
813
839
|
**extra: Annotated[
|
|
814
840
|
Any,
|
|
815
841
|
Doc(
|
|
@@ -838,6 +864,7 @@ class FastAPI(Starlette):
|
|
|
838
864
|
self.swagger_ui_parameters = swagger_ui_parameters
|
|
839
865
|
self.servers = servers or []
|
|
840
866
|
self.separate_input_output_schemas = separate_input_output_schemas
|
|
867
|
+
self.openapi_external_docs = openapi_external_docs
|
|
841
868
|
self.extra = extra
|
|
842
869
|
self.openapi_version: Annotated[
|
|
843
870
|
str,
|
|
@@ -992,6 +1019,7 @@ class FastAPI(Starlette):
|
|
|
992
1019
|
tags=self.openapi_tags,
|
|
993
1020
|
servers=self.servers,
|
|
994
1021
|
separate_input_output_schemas=self.separate_input_output_schemas,
|
|
1022
|
+
external_docs=self.openapi_external_docs,
|
|
995
1023
|
)
|
|
996
1024
|
return self.openapi_schema
|
|
997
1025
|
|
fastapi/dependencies/utils.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import inspect
|
|
2
|
+
import sys
|
|
2
3
|
from contextlib import AsyncExitStack, contextmanager
|
|
3
4
|
from copy import copy, deepcopy
|
|
4
5
|
from dataclasses import dataclass
|
|
@@ -73,6 +74,11 @@ from starlette.responses import Response
|
|
|
73
74
|
from starlette.websockets import WebSocket
|
|
74
75
|
from typing_extensions import Annotated, get_args, get_origin
|
|
75
76
|
|
|
77
|
+
if sys.version_info >= (3, 13): # pragma: no cover
|
|
78
|
+
from inspect import iscoroutinefunction
|
|
79
|
+
else: # pragma: no cover
|
|
80
|
+
from asyncio import iscoroutinefunction
|
|
81
|
+
|
|
76
82
|
multipart_not_installed_error = (
|
|
77
83
|
'Form data requires "python-multipart" to be installed. \n'
|
|
78
84
|
'You can install "python-multipart" with: \n\n'
|
|
@@ -248,6 +254,8 @@ def get_typed_annotation(annotation: Any, globalns: Dict[str, Any]) -> Any:
|
|
|
248
254
|
if isinstance(annotation, str):
|
|
249
255
|
annotation = ForwardRef(annotation)
|
|
250
256
|
annotation = evaluate_forwardref(annotation, globalns, globalns)
|
|
257
|
+
if annotation is type(None):
|
|
258
|
+
return None
|
|
251
259
|
return annotation
|
|
252
260
|
|
|
253
261
|
|
|
@@ -529,11 +537,11 @@ def add_param_to_fields(*, field: ModelField, dependant: Dependant) -> None:
|
|
|
529
537
|
|
|
530
538
|
def is_coroutine_callable(call: Callable[..., Any]) -> bool:
|
|
531
539
|
if inspect.isroutine(call):
|
|
532
|
-
return
|
|
540
|
+
return iscoroutinefunction(call)
|
|
533
541
|
if inspect.isclass(call):
|
|
534
542
|
return False
|
|
535
543
|
dunder_call = getattr(call, "__call__", None) # noqa: B004
|
|
536
|
-
return
|
|
544
|
+
return iscoroutinefunction(dunder_call)
|
|
537
545
|
|
|
538
546
|
|
|
539
547
|
def is_async_gen_callable(call: Callable[..., Any]) -> bool:
|
|
@@ -587,7 +595,8 @@ async def solve_dependencies(
|
|
|
587
595
|
response = Response()
|
|
588
596
|
del response.headers["content-length"]
|
|
589
597
|
response.status_code = None # type: ignore
|
|
590
|
-
|
|
598
|
+
if dependency_cache is None:
|
|
599
|
+
dependency_cache = {}
|
|
591
600
|
sub_dependant: Dependant
|
|
592
601
|
for sub_dependant in dependant.dependencies:
|
|
593
602
|
sub_dependant.call = cast(Callable[..., Any], sub_dependant.call)
|
|
@@ -624,7 +633,6 @@ async def solve_dependencies(
|
|
|
624
633
|
embed_body_fields=embed_body_fields,
|
|
625
634
|
)
|
|
626
635
|
background_tasks = solved_result.background_tasks
|
|
627
|
-
dependency_cache.update(solved_result.dependency_cache)
|
|
628
636
|
if solved_result.errors:
|
|
629
637
|
errors.extend(solved_result.errors)
|
|
630
638
|
continue
|
|
@@ -916,7 +924,11 @@ async def request_body_to_args(
|
|
|
916
924
|
|
|
917
925
|
fields_to_extract: List[ModelField] = body_fields
|
|
918
926
|
|
|
919
|
-
if
|
|
927
|
+
if (
|
|
928
|
+
single_not_embedded_field
|
|
929
|
+
and lenient_issubclass(first_field.type_, BaseModel)
|
|
930
|
+
and isinstance(received_body, FormData)
|
|
931
|
+
):
|
|
920
932
|
fields_to_extract = get_cached_model_fields(first_field.type_)
|
|
921
933
|
|
|
922
934
|
if isinstance(received_body, FormData):
|
fastapi/encoders.py
CHANGED
|
@@ -219,7 +219,7 @@ def jsonable_encoder(
|
|
|
219
219
|
if not PYDANTIC_V2:
|
|
220
220
|
encoders = getattr(obj.__config__, "json_encoders", {}) # type: ignore[attr-defined]
|
|
221
221
|
if custom_encoder:
|
|
222
|
-
encoders
|
|
222
|
+
encoders = {**encoders, **custom_encoder}
|
|
223
223
|
obj_dict = _model_dump(
|
|
224
224
|
obj,
|
|
225
225
|
mode="json",
|
|
@@ -241,6 +241,7 @@ def jsonable_encoder(
|
|
|
241
241
|
sqlalchemy_safe=sqlalchemy_safe,
|
|
242
242
|
)
|
|
243
243
|
if dataclasses.is_dataclass(obj):
|
|
244
|
+
assert not isinstance(obj, type)
|
|
244
245
|
obj_dict = dataclasses.asdict(obj)
|
|
245
246
|
return jsonable_encoder(
|
|
246
247
|
obj_dict,
|
fastapi/exception_handlers.py
CHANGED
|
@@ -5,7 +5,7 @@ from fastapi.websockets import WebSocket
|
|
|
5
5
|
from starlette.exceptions import HTTPException
|
|
6
6
|
from starlette.requests import Request
|
|
7
7
|
from starlette.responses import JSONResponse, Response
|
|
8
|
-
from starlette.status import
|
|
8
|
+
from starlette.status import WS_1008_POLICY_VIOLATION
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
async def http_exception_handler(request: Request, exc: HTTPException) -> Response:
|
|
@@ -21,7 +21,7 @@ async def request_validation_exception_handler(
|
|
|
21
21
|
request: Request, exc: RequestValidationError
|
|
22
22
|
) -> JSONResponse:
|
|
23
23
|
return JSONResponse(
|
|
24
|
-
status_code=
|
|
24
|
+
status_code=422,
|
|
25
25
|
content={"detail": jsonable_encoder(exc.errors())},
|
|
26
26
|
)
|
|
27
27
|
|
fastapi/openapi/models.py
CHANGED
|
@@ -121,6 +121,12 @@ class ExternalDocumentation(BaseModelWithConfig):
|
|
|
121
121
|
url: AnyUrl
|
|
122
122
|
|
|
123
123
|
|
|
124
|
+
# Ref JSON Schema 2020-12: https://json-schema.org/draft/2020-12/json-schema-validation#name-type
|
|
125
|
+
SchemaType = Literal[
|
|
126
|
+
"array", "boolean", "integer", "null", "number", "object", "string"
|
|
127
|
+
]
|
|
128
|
+
|
|
129
|
+
|
|
124
130
|
class Schema(BaseModelWithConfig):
|
|
125
131
|
# Ref: JSON Schema 2020-12: https://json-schema.org/draft/2020-12/json-schema-core.html#name-the-json-schema-core-vocabu
|
|
126
132
|
# Core Vocabulary
|
|
@@ -145,7 +151,7 @@ class Schema(BaseModelWithConfig):
|
|
|
145
151
|
dependentSchemas: Optional[Dict[str, "SchemaOrBool"]] = None
|
|
146
152
|
prefixItems: Optional[List["SchemaOrBool"]] = None
|
|
147
153
|
# TODO: uncomment and remove below when deprecating Pydantic v1
|
|
148
|
-
# It
|
|
154
|
+
# It generates a list of schemas for tuples, before prefixItems was available
|
|
149
155
|
# items: Optional["SchemaOrBool"] = None
|
|
150
156
|
items: Optional[Union["SchemaOrBool", List["SchemaOrBool"]]] = None
|
|
151
157
|
contains: Optional["SchemaOrBool"] = None
|
|
@@ -157,7 +163,7 @@ class Schema(BaseModelWithConfig):
|
|
|
157
163
|
unevaluatedProperties: Optional["SchemaOrBool"] = None
|
|
158
164
|
# Ref: JSON Schema Validation 2020-12: https://json-schema.org/draft/2020-12/json-schema-validation.html#name-a-vocabulary-for-structural
|
|
159
165
|
# A Vocabulary for Structural Validation
|
|
160
|
-
type: Optional[
|
|
166
|
+
type: Optional[Union[SchemaType, List[SchemaType]]] = None
|
|
161
167
|
enum: Optional[List[Any]] = None
|
|
162
168
|
const: Optional[Any] = None
|
|
163
169
|
multipleOf: Optional[float] = Field(default=None, gt=0)
|
fastapi/openapi/utils.py
CHANGED
|
@@ -35,7 +35,6 @@ from fastapi.utils import (
|
|
|
35
35
|
from pydantic import BaseModel
|
|
36
36
|
from starlette.responses import JSONResponse
|
|
37
37
|
from starlette.routing import BaseRoute
|
|
38
|
-
from starlette.status import HTTP_422_UNPROCESSABLE_ENTITY
|
|
39
38
|
from typing_extensions import Literal
|
|
40
39
|
|
|
41
40
|
validation_error_definition = {
|
|
@@ -416,7 +415,7 @@ def get_openapi_path(
|
|
|
416
415
|
)
|
|
417
416
|
deep_dict_update(openapi_response, process_response)
|
|
418
417
|
openapi_response["description"] = description
|
|
419
|
-
http422 =
|
|
418
|
+
http422 = "422"
|
|
420
419
|
all_route_params = get_flat_params(route.dependant)
|
|
421
420
|
if (all_route_params or route.body_field) and not any(
|
|
422
421
|
status in operation["responses"]
|
|
@@ -489,6 +488,7 @@ def get_openapi(
|
|
|
489
488
|
contact: Optional[Dict[str, Union[str, Any]]] = None,
|
|
490
489
|
license_info: Optional[Dict[str, Union[str, Any]]] = None,
|
|
491
490
|
separate_input_output_schemas: bool = True,
|
|
491
|
+
external_docs: Optional[Dict[str, Any]] = None,
|
|
492
492
|
) -> Dict[str, Any]:
|
|
493
493
|
info: Dict[str, Any] = {"title": title, "version": version}
|
|
494
494
|
if summary:
|
|
@@ -566,4 +566,6 @@ def get_openapi(
|
|
|
566
566
|
output["webhooks"] = webhook_paths
|
|
567
567
|
if tags:
|
|
568
568
|
output["tags"] = tags
|
|
569
|
+
if external_docs:
|
|
570
|
+
output["externalDocs"] = external_docs
|
|
569
571
|
return jsonable_encoder(OpenAPI(**output), by_alias=True, exclude_none=True) # type: ignore
|
fastapi/routing.py
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import asyncio
|
|
2
1
|
import dataclasses
|
|
3
2
|
import email.message
|
|
4
3
|
import inspect
|
|
5
4
|
import json
|
|
5
|
+
import sys
|
|
6
6
|
from contextlib import AsyncExitStack, asynccontextmanager
|
|
7
7
|
from enum import Enum, IntEnum
|
|
8
8
|
from typing import (
|
|
@@ -76,6 +76,11 @@ from starlette.types import AppType, ASGIApp, Lifespan, Scope
|
|
|
76
76
|
from starlette.websockets import WebSocket
|
|
77
77
|
from typing_extensions import Annotated, Doc, deprecated
|
|
78
78
|
|
|
79
|
+
if sys.version_info >= (3, 13): # pragma: no cover
|
|
80
|
+
from inspect import iscoroutinefunction
|
|
81
|
+
else: # pragma: no cover
|
|
82
|
+
from asyncio import iscoroutinefunction
|
|
83
|
+
|
|
79
84
|
|
|
80
85
|
def _prepare_response_content(
|
|
81
86
|
res: Any,
|
|
@@ -120,6 +125,7 @@ def _prepare_response_content(
|
|
|
120
125
|
for k, v in res.items()
|
|
121
126
|
}
|
|
122
127
|
elif dataclasses.is_dataclass(res):
|
|
128
|
+
assert not isinstance(res, type)
|
|
123
129
|
return dataclasses.asdict(res)
|
|
124
130
|
return res
|
|
125
131
|
|
|
@@ -231,7 +237,7 @@ def get_request_handler(
|
|
|
231
237
|
embed_body_fields: bool = False,
|
|
232
238
|
) -> Callable[[Request], Coroutine[Any, Any, Response]]:
|
|
233
239
|
assert dependant.call is not None, "dependant.call must be a function"
|
|
234
|
-
is_coroutine =
|
|
240
|
+
is_coroutine = iscoroutinefunction(dependant.call)
|
|
235
241
|
is_body_form = body_field and isinstance(body_field.field_info, params.Form)
|
|
236
242
|
if isinstance(response_class, DefaultPlaceholder):
|
|
237
243
|
actual_response_class: Type[Response] = response_class.value
|
fastapi/security/api_key.py
CHANGED
|
@@ -100,7 +100,7 @@ class APIKeyQuery(APIKeyBase):
|
|
|
100
100
|
] = True,
|
|
101
101
|
):
|
|
102
102
|
self.model: APIKey = APIKey(
|
|
103
|
-
**{"in": APIKeyIn.query},
|
|
103
|
+
**{"in": APIKeyIn.query},
|
|
104
104
|
name=name,
|
|
105
105
|
description=description,
|
|
106
106
|
)
|
|
@@ -188,7 +188,7 @@ class APIKeyHeader(APIKeyBase):
|
|
|
188
188
|
] = True,
|
|
189
189
|
):
|
|
190
190
|
self.model: APIKey = APIKey(
|
|
191
|
-
**{"in": APIKeyIn.header},
|
|
191
|
+
**{"in": APIKeyIn.header},
|
|
192
192
|
name=name,
|
|
193
193
|
description=description,
|
|
194
194
|
)
|
|
@@ -276,7 +276,7 @@ class APIKeyCookie(APIKeyBase):
|
|
|
276
276
|
] = True,
|
|
277
277
|
):
|
|
278
278
|
self.model: APIKey = APIKey(
|
|
279
|
-
**{"in": APIKeyIn.cookie},
|
|
279
|
+
**{"in": APIKeyIn.cookie},
|
|
280
280
|
name=name,
|
|
281
281
|
description=description,
|
|
282
282
|
)
|
fastapi/utils.py
CHANGED
|
@@ -137,6 +137,7 @@ def create_cloned_field(
|
|
|
137
137
|
new_field.alias = field.alias # type: ignore[misc]
|
|
138
138
|
new_field.class_validators = field.class_validators # type: ignore[attr-defined]
|
|
139
139
|
new_field.default = field.default # type: ignore[misc]
|
|
140
|
+
new_field.default_factory = field.default_factory # type: ignore[attr-defined]
|
|
140
141
|
new_field.required = field.required # type: ignore[misc]
|
|
141
142
|
new_field.model_config = field.model_config # type: ignore[attr-defined]
|
|
142
143
|
new_field.field_info = field.field_info
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: fastapi
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.117.0
|
|
4
4
|
Summary: FastAPI framework, high performance, easy to learn, fast to code, ready for production
|
|
5
5
|
Author-Email: =?utf-8?q?Sebasti=C3=A1n_Ram=C3=ADrez?= <tiangolo@gmail.com>
|
|
6
6
|
Classifier: Intended Audience :: Information Technology
|
|
@@ -38,26 +38,26 @@ Project-URL: Repository, https://github.com/fastapi/fastapi
|
|
|
38
38
|
Project-URL: Issues, https://github.com/fastapi/fastapi/issues
|
|
39
39
|
Project-URL: Changelog, https://fastapi.tiangolo.com/release-notes/
|
|
40
40
|
Requires-Python: >=3.8
|
|
41
|
-
Requires-Dist: starlette<0.
|
|
41
|
+
Requires-Dist: starlette<0.49.0,>=0.40.0
|
|
42
42
|
Requires-Dist: pydantic!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0,>=1.7.4
|
|
43
43
|
Requires-Dist: typing-extensions>=4.8.0
|
|
44
44
|
Provides-Extra: standard
|
|
45
45
|
Requires-Dist: fastapi-cli[standard]>=0.0.8; extra == "standard"
|
|
46
|
-
Requires-Dist: httpx
|
|
46
|
+
Requires-Dist: httpx<1.0.0,>=0.23.0; extra == "standard"
|
|
47
47
|
Requires-Dist: jinja2>=3.1.5; extra == "standard"
|
|
48
48
|
Requires-Dist: python-multipart>=0.0.18; extra == "standard"
|
|
49
49
|
Requires-Dist: email-validator>=2.0.0; extra == "standard"
|
|
50
50
|
Requires-Dist: uvicorn[standard]>=0.12.0; extra == "standard"
|
|
51
51
|
Provides-Extra: standard-no-fastapi-cloud-cli
|
|
52
52
|
Requires-Dist: fastapi-cli[standard-no-fastapi-cloud-cli]>=0.0.8; extra == "standard-no-fastapi-cloud-cli"
|
|
53
|
-
Requires-Dist: httpx
|
|
53
|
+
Requires-Dist: httpx<1.0.0,>=0.23.0; extra == "standard-no-fastapi-cloud-cli"
|
|
54
54
|
Requires-Dist: jinja2>=3.1.5; extra == "standard-no-fastapi-cloud-cli"
|
|
55
55
|
Requires-Dist: python-multipart>=0.0.18; extra == "standard-no-fastapi-cloud-cli"
|
|
56
56
|
Requires-Dist: email-validator>=2.0.0; extra == "standard-no-fastapi-cloud-cli"
|
|
57
57
|
Requires-Dist: uvicorn[standard]>=0.12.0; extra == "standard-no-fastapi-cloud-cli"
|
|
58
58
|
Provides-Extra: all
|
|
59
59
|
Requires-Dist: fastapi-cli[standard]>=0.0.8; extra == "all"
|
|
60
|
-
Requires-Dist: httpx
|
|
60
|
+
Requires-Dist: httpx<1.0.0,>=0.23.0; extra == "all"
|
|
61
61
|
Requires-Dist: jinja2>=3.1.5; extra == "all"
|
|
62
62
|
Requires-Dist: python-multipart>=0.0.18; extra == "all"
|
|
63
63
|
Requires-Dist: itsdangerous>=1.1.0; extra == "all"
|
|
@@ -119,7 +119,6 @@ The key features are:
|
|
|
119
119
|
<!-- sponsors -->
|
|
120
120
|
|
|
121
121
|
<a href="https://blockbee.io?ref=fastapi" target="_blank" title="BlockBee Cryptocurrency Payment Gateway"><img src="https://fastapi.tiangolo.com/img/sponsors/blockbee.png"></a>
|
|
122
|
-
<a href="https://platform.sh/try-it-now/?utm_source=fastapi-signup&utm_medium=banner&utm_campaign=FastAPI-signup-June-2023" target="_blank" title="Build, run and scale your apps on a modern, reliable, and secure PaaS."><img src="https://fastapi.tiangolo.com/img/sponsors/platform-sh.png"></a>
|
|
123
122
|
<a href="https://github.com/scalar/scalar/?utm_source=fastapi&utm_medium=website&utm_campaign=main-badge" target="_blank" title="Scalar: Beautiful Open-Source API References from Swagger/OpenAPI files"><img src="https://fastapi.tiangolo.com/img/sponsors/scalar.svg"></a>
|
|
124
123
|
<a href="https://www.propelauth.com/?utm_source=fastapi&utm_campaign=1223&utm_medium=mainbadge" target="_blank" title="Auth, user management and more for your B2B product"><img src="https://fastapi.tiangolo.com/img/sponsors/propelauth.png"></a>
|
|
125
124
|
<a href="https://zuplo.link/fastapi-gh" target="_blank" title="Zuplo: Deploy, Secure, Document, and Monetize your FastAPI"><img src="https://fastapi.tiangolo.com/img/sponsors/zuplo.png"></a>
|
|
@@ -127,7 +126,8 @@ The key features are:
|
|
|
127
126
|
<a href="https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi" target="_blank" title="Deploy & scale any full-stack web app on Render. Focus on building apps, not infra."><img src="https://fastapi.tiangolo.com/img/sponsors/render.svg"></a>
|
|
128
127
|
<a href="https://www.coderabbit.ai/?utm_source=fastapi&utm_medium=badge&utm_campaign=fastapi" target="_blank" title="Cut Code Review Time & Bugs in Half with CodeRabbit"><img src="https://fastapi.tiangolo.com/img/sponsors/coderabbit.png"></a>
|
|
129
128
|
<a href="https://subtotal.com/?utm_source=fastapi&utm_medium=sponsorship&utm_campaign=open-source" target="_blank" title="The Gold Standard in Retail Account Linking"><img src="https://fastapi.tiangolo.com/img/sponsors/subtotal.svg"></a>
|
|
130
|
-
<a href="https://
|
|
129
|
+
<a href="https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi" target="_blank" title="Deploy enterprise applications at startup speed"><img src="https://fastapi.tiangolo.com/img/sponsors/railway.png"></a>
|
|
130
|
+
<a href="https://databento.com/?utm_source=fastapi&utm_medium=sponsor&utm_content=display" target="_blank" title="Pay as you go for market data"><img src="https://fastapi.tiangolo.com/img/sponsors/databento.svg"></a>
|
|
131
131
|
<a href="https://speakeasy.com/editor?utm_source=fastapi+repo&utm_medium=github+sponsorship" target="_blank" title="SDKs for your API | Speakeasy"><img src="https://fastapi.tiangolo.com/img/sponsors/speakeasy.png"></a>
|
|
132
132
|
<a href="https://www.svix.com/" target="_blank" title="Svix - Webhooks as a service"><img src="https://fastapi.tiangolo.com/img/sponsors/svix.svg"></a>
|
|
133
133
|
<a href="https://www.stainlessapi.com/?utm_source=fastapi&utm_medium=referral" target="_blank" title="Stainless | Generate best-in-class SDKs"><img src="https://fastapi.tiangolo.com/img/sponsors/stainless.png"></a>
|
|
@@ -161,7 +161,7 @@ The key features are:
|
|
|
161
161
|
|
|
162
162
|
"_I’m over the moon excited about **FastAPI**. It’s so fun!_"
|
|
163
163
|
|
|
164
|
-
<div style="text-align: right; margin-right: 10%;">Brian Okken - <strong><a href="https://pythonbytes.fm/episodes/show/123/time-to-right-the-py-wrongs?time_in_sec=855" target="_blank">Python Bytes</a> podcast host</strong> <a href="https://
|
|
164
|
+
<div style="text-align: right; margin-right: 10%;">Brian Okken - <strong><a href="https://pythonbytes.fm/episodes/show/123/time-to-right-the-py-wrongs?time_in_sec=855" target="_blank">Python Bytes</a> podcast host</strong> <a href="https://x.com/brianokken/status/1112220079972728832" target="_blank"><small>(ref)</small></a></div>
|
|
165
165
|
|
|
166
166
|
---
|
|
167
167
|
|
|
@@ -175,7 +175,7 @@ The key features are:
|
|
|
175
175
|
|
|
176
176
|
"_We've switched over to **FastAPI** for our **APIs** [...] I think you'll like it [...]_"
|
|
177
177
|
|
|
178
|
-
<div style="text-align: right; margin-right: 10%;">Ines Montani - Matthew Honnibal - <strong><a href="https://explosion.ai" target="_blank">Explosion AI</a> founders - <a href="https://spacy.io" target="_blank">spaCy</a> creators</strong> <a href="https://
|
|
178
|
+
<div style="text-align: right; margin-right: 10%;">Ines Montani - Matthew Honnibal - <strong><a href="https://explosion.ai" target="_blank">Explosion AI</a> founders - <a href="https://spacy.io" target="_blank">spaCy</a> creators</strong> <a href="https://x.com/_inesmontani/status/1144173225322143744" target="_blank"><small>(ref)</small></a> - <a href="https://x.com/honnibal/status/1144031421859655680" target="_blank"><small>(ref)</small></a></div>
|
|
179
179
|
|
|
180
180
|
---
|
|
181
181
|
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
fastapi-0.
|
|
2
|
-
fastapi-0.
|
|
3
|
-
fastapi-0.
|
|
4
|
-
fastapi-0.
|
|
5
|
-
fastapi/__init__.py,sha256
|
|
1
|
+
fastapi-0.117.0.dist-info/METADATA,sha256=a_6-VSmVf3pQTvUR5AD-EYxN8A5jcjUQOXB13_KJk5Q,28135
|
|
2
|
+
fastapi-0.117.0.dist-info/WHEEL,sha256=9P2ygRxDrTJz3gsagc0Z96ukrxjr-LFBGOgv3AuKlCA,90
|
|
3
|
+
fastapi-0.117.0.dist-info/entry_points.txt,sha256=GCf-WbIZxyGT4MUmrPGj1cOHYZoGsNPHAvNkT6hnGeA,61
|
|
4
|
+
fastapi-0.117.0.dist-info/licenses/LICENSE,sha256=Tsif_IFIW5f-xYSy1KlhAy7v_oNEU4lP2cEnSQbMdE4,1086
|
|
5
|
+
fastapi/__init__.py,sha256=kABrsOHBxqoWBLvbTjMc2bL6XdMxbLNqWWYfXR7AyMU,1081
|
|
6
6
|
fastapi/__main__.py,sha256=bKePXLdO4SsVSM6r9SVoLickJDcR2c0cTOxZRKq26YQ,37
|
|
7
|
-
fastapi/_compat.py,sha256=
|
|
8
|
-
fastapi/applications.py,sha256=
|
|
7
|
+
fastapi/_compat.py,sha256=EQyNY-qrN3cjwI1r69JVAROc2lQCvi6W1we6_7jx_gc,24274
|
|
8
|
+
fastapi/applications.py,sha256=Sr6fkAYFmuyIT4b0Rm33NQzO8oz4-DEc3PLTxp4LJgU,177570
|
|
9
9
|
fastapi/background.py,sha256=rouLirxUANrcYC824MSMypXL_Qb2HYg2YZqaiEqbEKI,1768
|
|
10
10
|
fastapi/cli.py,sha256=OYhZb0NR_deuT5ofyPF2NoNBzZDNOP8Salef2nk-HqA,418
|
|
11
11
|
fastapi/concurrency.py,sha256=MirfowoSpkMQZ8j_g0ZxaQKpV6eB3G-dB5TgcXCrgEA,1424
|
|
12
12
|
fastapi/datastructures.py,sha256=b2PEz77XGq-u3Ur1Inwk0AGjOsQZO49yF9C7IPJ15cY,5766
|
|
13
13
|
fastapi/dependencies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
14
14
|
fastapi/dependencies/models.py,sha256=Pjl6vx-4nZ5Tta9kJa3-RfQKkXtCpS09-FhMgs9eWNs,1507
|
|
15
|
-
fastapi/dependencies/utils.py,sha256=
|
|
16
|
-
fastapi/encoders.py,sha256=
|
|
17
|
-
fastapi/exception_handlers.py,sha256=
|
|
15
|
+
fastapi/dependencies/utils.py,sha256=zcOLg1Y0AHdoHvVbe6mrelzST8tmjFJeoaoHEK9jlyA,36867
|
|
16
|
+
fastapi/encoders.py,sha256=r_fOgMylrlnCDTh3W9u2W0ZsHTJqIhLpU6QipHMy0m8,11119
|
|
17
|
+
fastapi/exception_handlers.py,sha256=YVcT8Zy021VYYeecgdyh5YEUjEIHKcLspbkSf4OfbJI,1275
|
|
18
18
|
fastapi/exceptions.py,sha256=taNixuFEXb67lI1bnX1ubq8y8TseJ4yoPlWjyP0fTzk,4969
|
|
19
19
|
fastapi/logger.py,sha256=I9NNi3ov8AcqbsbC9wl1X-hdItKgYt2XTrx1f99Zpl4,54
|
|
20
20
|
fastapi/middleware/__init__.py,sha256=oQDxiFVcc1fYJUOIFvphnK7pTT5kktmfL32QXpBFvvo,58
|
|
@@ -26,16 +26,16 @@ fastapi/middleware/wsgi.py,sha256=Z3Ue-7wni4lUZMvH3G9ek__acgYdJstbnpZX_HQAboY,79
|
|
|
26
26
|
fastapi/openapi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
27
27
|
fastapi/openapi/constants.py,sha256=adGzmis1L1HJRTE3kJ5fmHS_Noq6tIY6pWv_SFzoFDU,153
|
|
28
28
|
fastapi/openapi/docs.py,sha256=zSDv4xY6XHcKsaG4zyk1HqSnrZtfZFBB0J7ZBk5YHPE,10345
|
|
29
|
-
fastapi/openapi/models.py,sha256=
|
|
30
|
-
fastapi/openapi/utils.py,sha256=
|
|
29
|
+
fastapi/openapi/models.py,sha256=m1BNHxf_RiDTK1uCfMre6XZN5y7krZNA62QEP_2EV9s,15625
|
|
30
|
+
fastapi/openapi/utils.py,sha256=ZI-nwdT2PtX8kaRPJylZo4LJHjYAcoVGxkd181P75x4,23997
|
|
31
31
|
fastapi/param_functions.py,sha256=JHNPLIYvoAwdnZZavIVsxOat8x23fX_Kl33reh7HKl8,64019
|
|
32
32
|
fastapi/params.py,sha256=g450axUBQgQJODdtM7WBxZbQj9Z64inFvadrgHikBbU,28237
|
|
33
33
|
fastapi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
34
34
|
fastapi/requests.py,sha256=zayepKFcienBllv3snmWI20Gk0oHNVLU4DDhqXBb4LU,142
|
|
35
35
|
fastapi/responses.py,sha256=QNQQlwpKhQoIPZTTWkpc9d_QGeGZ_aVQPaDV3nQ8m7c,1761
|
|
36
|
-
fastapi/routing.py,sha256
|
|
36
|
+
fastapi/routing.py,sha256=4zaZIdeq8VtsBLCxmmEgnfHqDD6USTc_l8BxUe1ye4M,176533
|
|
37
37
|
fastapi/security/__init__.py,sha256=bO8pNmxqVRXUjfl2mOKiVZLn0FpBQ61VUYVjmppnbJw,881
|
|
38
|
-
fastapi/security/api_key.py,sha256=
|
|
38
|
+
fastapi/security/api_key.py,sha256=di-0gQ8MKugi2YfmlMoDHk-QMF_vnLGJRFOA6tcZ7fA,9016
|
|
39
39
|
fastapi/security/base.py,sha256=dl4pvbC-RxjfbWgPtCWd8MVU-7CB2SZ22rJDXVCXO6c,141
|
|
40
40
|
fastapi/security/http.py,sha256=rWR2x-5CUsjWmRucYthwRig6MG1o-boyrr4Xo-PuuxU,13606
|
|
41
41
|
fastapi/security/oauth2.py,sha256=M1AFIDT7G3oQChq83poI3eg8ZDeibcvnGmya2CTS7JY,22036
|
|
@@ -45,6 +45,6 @@ fastapi/staticfiles.py,sha256=iirGIt3sdY2QZXd36ijs3Cj-T0FuGFda3cd90kM9Ikw,69
|
|
|
45
45
|
fastapi/templating.py,sha256=4zsuTWgcjcEainMJFAlW6-gnslm6AgOS1SiiDWfmQxk,76
|
|
46
46
|
fastapi/testclient.py,sha256=nBvaAmX66YldReJNZXPOk1sfuo2Q6hs8bOvIaCep6LQ,66
|
|
47
47
|
fastapi/types.py,sha256=nFb36sK3DSoqoyo7Miwy3meKK5UdFBgkAgLSzQlUVyI,383
|
|
48
|
-
fastapi/utils.py,sha256=
|
|
48
|
+
fastapi/utils.py,sha256=S59stPvKPUJ7MSkke3FaegSyig_4Uwhd32jnLiMF1jE,8032
|
|
49
49
|
fastapi/websockets.py,sha256=419uncYObEKZG0YcrXscfQQYLSWoE10jqxVMetGdR98,222
|
|
50
|
-
fastapi-0.
|
|
50
|
+
fastapi-0.117.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|