mirror of
https://github.com/rjNemo/fastapi
synced 2026-06-06 02:26:46 +00:00
♻️ Refine internal type declarations and logic around them (#338)
This commit is contained in:
parent
06eb775c63
commit
dcc1e1bcf8
10 changed files with 76 additions and 69 deletions
|
|
@ -1,4 +1,4 @@
|
||||||
from typing import Any, Callable, Dict, List, Optional, Set, Type, Union
|
from typing import Any, Callable, Dict, List, Optional, Sequence, Set, Type, Union
|
||||||
|
|
||||||
from fastapi import routing
|
from fastapi import routing
|
||||||
from fastapi.exception_handlers import (
|
from fastapi.exception_handlers import (
|
||||||
|
|
@ -130,7 +130,7 @@ class FastAPI(Starlette):
|
||||||
response_model: Type[Any] = None,
|
response_model: Type[Any] = None,
|
||||||
status_code: int = 200,
|
status_code: int = 200,
|
||||||
tags: List[str] = None,
|
tags: List[str] = None,
|
||||||
dependencies: List[Depends] = None,
|
dependencies: Sequence[Depends] = None,
|
||||||
summary: str = None,
|
summary: str = None,
|
||||||
description: str = None,
|
description: str = None,
|
||||||
response_description: str = "Successful Response",
|
response_description: str = "Successful Response",
|
||||||
|
|
@ -152,7 +152,7 @@ class FastAPI(Starlette):
|
||||||
response_model=response_model,
|
response_model=response_model,
|
||||||
status_code=status_code,
|
status_code=status_code,
|
||||||
tags=tags or [],
|
tags=tags or [],
|
||||||
dependencies=dependencies or [],
|
dependencies=dependencies,
|
||||||
summary=summary,
|
summary=summary,
|
||||||
description=description,
|
description=description,
|
||||||
response_description=response_description,
|
response_description=response_description,
|
||||||
|
|
@ -176,7 +176,7 @@ class FastAPI(Starlette):
|
||||||
response_model: Type[Any] = None,
|
response_model: Type[Any] = None,
|
||||||
status_code: int = 200,
|
status_code: int = 200,
|
||||||
tags: List[str] = None,
|
tags: List[str] = None,
|
||||||
dependencies: List[Depends] = None,
|
dependencies: Sequence[Depends] = None,
|
||||||
summary: str = None,
|
summary: str = None,
|
||||||
description: str = None,
|
description: str = None,
|
||||||
response_description: str = "Successful Response",
|
response_description: str = "Successful Response",
|
||||||
|
|
@ -199,7 +199,7 @@ class FastAPI(Starlette):
|
||||||
response_model=response_model,
|
response_model=response_model,
|
||||||
status_code=status_code,
|
status_code=status_code,
|
||||||
tags=tags or [],
|
tags=tags or [],
|
||||||
dependencies=dependencies or [],
|
dependencies=dependencies,
|
||||||
summary=summary,
|
summary=summary,
|
||||||
description=description,
|
description=description,
|
||||||
response_description=response_description,
|
response_description=response_description,
|
||||||
|
|
@ -237,7 +237,7 @@ class FastAPI(Starlette):
|
||||||
*,
|
*,
|
||||||
prefix: str = "",
|
prefix: str = "",
|
||||||
tags: List[str] = None,
|
tags: List[str] = None,
|
||||||
dependencies: List[Depends] = None,
|
dependencies: Sequence[Depends] = None,
|
||||||
responses: Dict[Union[int, str], Dict[str, Any]] = None,
|
responses: Dict[Union[int, str], Dict[str, Any]] = None,
|
||||||
) -> None:
|
) -> None:
|
||||||
self.router.include_router(
|
self.router.include_router(
|
||||||
|
|
@ -255,7 +255,7 @@ class FastAPI(Starlette):
|
||||||
response_model: Type[Any] = None,
|
response_model: Type[Any] = None,
|
||||||
status_code: int = 200,
|
status_code: int = 200,
|
||||||
tags: List[str] = None,
|
tags: List[str] = None,
|
||||||
dependencies: List[Depends] = None,
|
dependencies: Sequence[Depends] = None,
|
||||||
summary: str = None,
|
summary: str = None,
|
||||||
description: str = None,
|
description: str = None,
|
||||||
response_description: str = "Successful Response",
|
response_description: str = "Successful Response",
|
||||||
|
|
@ -275,7 +275,7 @@ class FastAPI(Starlette):
|
||||||
response_model=response_model,
|
response_model=response_model,
|
||||||
status_code=status_code,
|
status_code=status_code,
|
||||||
tags=tags or [],
|
tags=tags or [],
|
||||||
dependencies=dependencies or [],
|
dependencies=dependencies,
|
||||||
summary=summary,
|
summary=summary,
|
||||||
description=description,
|
description=description,
|
||||||
response_description=response_description,
|
response_description=response_description,
|
||||||
|
|
@ -298,7 +298,7 @@ class FastAPI(Starlette):
|
||||||
response_model: Type[Any] = None,
|
response_model: Type[Any] = None,
|
||||||
status_code: int = 200,
|
status_code: int = 200,
|
||||||
tags: List[str] = None,
|
tags: List[str] = None,
|
||||||
dependencies: List[Depends] = None,
|
dependencies: Sequence[Depends] = None,
|
||||||
summary: str = None,
|
summary: str = None,
|
||||||
description: str = None,
|
description: str = None,
|
||||||
response_description: str = "Successful Response",
|
response_description: str = "Successful Response",
|
||||||
|
|
@ -318,7 +318,7 @@ class FastAPI(Starlette):
|
||||||
response_model=response_model,
|
response_model=response_model,
|
||||||
status_code=status_code,
|
status_code=status_code,
|
||||||
tags=tags or [],
|
tags=tags or [],
|
||||||
dependencies=dependencies or [],
|
dependencies=dependencies,
|
||||||
summary=summary,
|
summary=summary,
|
||||||
description=description,
|
description=description,
|
||||||
response_description=response_description,
|
response_description=response_description,
|
||||||
|
|
@ -341,7 +341,7 @@ class FastAPI(Starlette):
|
||||||
response_model: Type[Any] = None,
|
response_model: Type[Any] = None,
|
||||||
status_code: int = 200,
|
status_code: int = 200,
|
||||||
tags: List[str] = None,
|
tags: List[str] = None,
|
||||||
dependencies: List[Depends] = None,
|
dependencies: Sequence[Depends] = None,
|
||||||
summary: str = None,
|
summary: str = None,
|
||||||
description: str = None,
|
description: str = None,
|
||||||
response_description: str = "Successful Response",
|
response_description: str = "Successful Response",
|
||||||
|
|
@ -361,7 +361,7 @@ class FastAPI(Starlette):
|
||||||
response_model=response_model,
|
response_model=response_model,
|
||||||
status_code=status_code,
|
status_code=status_code,
|
||||||
tags=tags or [],
|
tags=tags or [],
|
||||||
dependencies=dependencies or [],
|
dependencies=dependencies,
|
||||||
summary=summary,
|
summary=summary,
|
||||||
description=description,
|
description=description,
|
||||||
response_description=response_description,
|
response_description=response_description,
|
||||||
|
|
@ -384,7 +384,7 @@ class FastAPI(Starlette):
|
||||||
response_model: Type[Any] = None,
|
response_model: Type[Any] = None,
|
||||||
status_code: int = 200,
|
status_code: int = 200,
|
||||||
tags: List[str] = None,
|
tags: List[str] = None,
|
||||||
dependencies: List[Depends] = None,
|
dependencies: Sequence[Depends] = None,
|
||||||
summary: str = None,
|
summary: str = None,
|
||||||
description: str = None,
|
description: str = None,
|
||||||
response_description: str = "Successful Response",
|
response_description: str = "Successful Response",
|
||||||
|
|
@ -404,7 +404,7 @@ class FastAPI(Starlette):
|
||||||
response_model=response_model,
|
response_model=response_model,
|
||||||
status_code=status_code,
|
status_code=status_code,
|
||||||
tags=tags or [],
|
tags=tags or [],
|
||||||
dependencies=dependencies or [],
|
dependencies=dependencies,
|
||||||
summary=summary,
|
summary=summary,
|
||||||
description=description,
|
description=description,
|
||||||
response_description=response_description,
|
response_description=response_description,
|
||||||
|
|
@ -427,7 +427,7 @@ class FastAPI(Starlette):
|
||||||
response_model: Type[Any] = None,
|
response_model: Type[Any] = None,
|
||||||
status_code: int = 200,
|
status_code: int = 200,
|
||||||
tags: List[str] = None,
|
tags: List[str] = None,
|
||||||
dependencies: List[Depends] = None,
|
dependencies: Sequence[Depends] = None,
|
||||||
summary: str = None,
|
summary: str = None,
|
||||||
description: str = None,
|
description: str = None,
|
||||||
response_description: str = "Successful Response",
|
response_description: str = "Successful Response",
|
||||||
|
|
@ -447,7 +447,7 @@ class FastAPI(Starlette):
|
||||||
response_model=response_model,
|
response_model=response_model,
|
||||||
status_code=status_code,
|
status_code=status_code,
|
||||||
tags=tags or [],
|
tags=tags or [],
|
||||||
dependencies=dependencies or [],
|
dependencies=dependencies,
|
||||||
summary=summary,
|
summary=summary,
|
||||||
description=description,
|
description=description,
|
||||||
response_description=response_description,
|
response_description=response_description,
|
||||||
|
|
@ -470,7 +470,7 @@ class FastAPI(Starlette):
|
||||||
response_model: Type[Any] = None,
|
response_model: Type[Any] = None,
|
||||||
status_code: int = 200,
|
status_code: int = 200,
|
||||||
tags: List[str] = None,
|
tags: List[str] = None,
|
||||||
dependencies: List[Depends] = None,
|
dependencies: Sequence[Depends] = None,
|
||||||
summary: str = None,
|
summary: str = None,
|
||||||
description: str = None,
|
description: str = None,
|
||||||
response_description: str = "Successful Response",
|
response_description: str = "Successful Response",
|
||||||
|
|
@ -490,7 +490,7 @@ class FastAPI(Starlette):
|
||||||
response_model=response_model,
|
response_model=response_model,
|
||||||
status_code=status_code,
|
status_code=status_code,
|
||||||
tags=tags or [],
|
tags=tags or [],
|
||||||
dependencies=dependencies or [],
|
dependencies=dependencies,
|
||||||
summary=summary,
|
summary=summary,
|
||||||
description=description,
|
description=description,
|
||||||
response_description=response_description,
|
response_description=response_description,
|
||||||
|
|
@ -513,7 +513,7 @@ class FastAPI(Starlette):
|
||||||
response_model: Type[Any] = None,
|
response_model: Type[Any] = None,
|
||||||
status_code: int = 200,
|
status_code: int = 200,
|
||||||
tags: List[str] = None,
|
tags: List[str] = None,
|
||||||
dependencies: List[Depends] = None,
|
dependencies: Sequence[Depends] = None,
|
||||||
summary: str = None,
|
summary: str = None,
|
||||||
description: str = None,
|
description: str = None,
|
||||||
response_description: str = "Successful Response",
|
response_description: str = "Successful Response",
|
||||||
|
|
@ -533,7 +533,7 @@ class FastAPI(Starlette):
|
||||||
response_model=response_model,
|
response_model=response_model,
|
||||||
status_code=status_code,
|
status_code=status_code,
|
||||||
tags=tags or [],
|
tags=tags or [],
|
||||||
dependencies=dependencies or [],
|
dependencies=dependencies,
|
||||||
summary=summary,
|
summary=summary,
|
||||||
description=description,
|
description=description,
|
||||||
response_description=response_description,
|
response_description=response_description,
|
||||||
|
|
@ -556,7 +556,7 @@ class FastAPI(Starlette):
|
||||||
response_model: Type[Any] = None,
|
response_model: Type[Any] = None,
|
||||||
status_code: int = 200,
|
status_code: int = 200,
|
||||||
tags: List[str] = None,
|
tags: List[str] = None,
|
||||||
dependencies: List[Depends] = None,
|
dependencies: Sequence[Depends] = None,
|
||||||
summary: str = None,
|
summary: str = None,
|
||||||
description: str = None,
|
description: str = None,
|
||||||
response_description: str = "Successful Response",
|
response_description: str = "Successful Response",
|
||||||
|
|
@ -576,7 +576,7 @@ class FastAPI(Starlette):
|
||||||
response_model=response_model,
|
response_model=response_model,
|
||||||
status_code=status_code,
|
status_code=status_code,
|
||||||
tags=tags or [],
|
tags=tags or [],
|
||||||
dependencies=dependencies or [],
|
dependencies=dependencies,
|
||||||
summary=summary,
|
summary=summary,
|
||||||
description=description,
|
description=description,
|
||||||
response_description=response_description,
|
response_description=response_description,
|
||||||
|
|
|
||||||
|
|
@ -242,7 +242,7 @@ def get_param_field(
|
||||||
if isinstance(schema, params.Param) and getattr(schema, "in_", None) is None:
|
if isinstance(schema, params.Param) and getattr(schema, "in_", None) is None:
|
||||||
schema.in_ = default_schema.in_
|
schema.in_ = default_schema.in_
|
||||||
if force_type:
|
if force_type:
|
||||||
schema.in_ = force_type
|
schema.in_ = force_type # type: ignore
|
||||||
else:
|
else:
|
||||||
schema = default_schema(default_value)
|
schema = default_schema(default_value)
|
||||||
required = default_value == Required
|
required = default_value == Required
|
||||||
|
|
@ -422,7 +422,7 @@ def request_params_to_args(
|
||||||
value = received_params.getlist(field.alias) or field.default
|
value = received_params.getlist(field.alias) or field.default
|
||||||
else:
|
else:
|
||||||
value = received_params.get(field.alias)
|
value = received_params.get(field.alias)
|
||||||
schema: params.Param = field.schema
|
schema = field.schema
|
||||||
assert isinstance(schema, params.Param), "Params must be subclasses of Param"
|
assert isinstance(schema, params.Param), "Params must be subclasses of Param"
|
||||||
if value is None:
|
if value is None:
|
||||||
if field.required:
|
if field.required:
|
||||||
|
|
@ -458,7 +458,7 @@ async def request_body_to_args(
|
||||||
if len(required_params) == 1 and not embed:
|
if len(required_params) == 1 and not embed:
|
||||||
received_body = {field.alias: received_body}
|
received_body = {field.alias: received_body}
|
||||||
for field in required_params:
|
for field in required_params:
|
||||||
value = None
|
value: Any = None
|
||||||
if received_body is not None:
|
if received_body is not None:
|
||||||
if field.shape in sequence_shapes and isinstance(
|
if field.shape in sequence_shapes and isinstance(
|
||||||
received_body, FormData
|
received_body, FormData
|
||||||
|
|
|
||||||
|
|
@ -122,7 +122,7 @@ class Schema(SchemaBase):
|
||||||
not_: Optional[List[SchemaBase]] = PSchema(None, alias="not") # type: ignore
|
not_: Optional[List[SchemaBase]] = PSchema(None, alias="not") # type: ignore
|
||||||
items: Optional[SchemaBase] = None
|
items: Optional[SchemaBase] = None
|
||||||
properties: Optional[Dict[str, SchemaBase]] = None
|
properties: Optional[Dict[str, SchemaBase]] = None
|
||||||
additionalProperties: Optional[Union[SchemaBase, bool]] = None
|
additionalProperties: Optional[Union[SchemaBase, bool]] = None # type: ignore
|
||||||
|
|
||||||
|
|
||||||
class Example(BaseModel):
|
class Example(BaseModel):
|
||||||
|
|
@ -149,9 +149,9 @@ class Encoding(BaseModel):
|
||||||
|
|
||||||
|
|
||||||
class MediaType(BaseModel):
|
class MediaType(BaseModel):
|
||||||
schema_: Optional[Union[Schema, Reference]] = PSchema(
|
schema_: Optional[Union[Schema, Reference]] = PSchema( # type: ignore
|
||||||
None, alias="schema"
|
None, alias="schema"
|
||||||
) # type: ignore
|
)
|
||||||
example: Optional[Any] = None
|
example: Optional[Any] = None
|
||||||
examples: Optional[Dict[str, Union[Example, Reference]]] = None
|
examples: Optional[Dict[str, Union[Example, Reference]]] = None
|
||||||
encoding: Optional[Dict[str, Encoding]] = None
|
encoding: Optional[Dict[str, Encoding]] = None
|
||||||
|
|
@ -165,9 +165,9 @@ class ParameterBase(BaseModel):
|
||||||
style: Optional[str] = None
|
style: Optional[str] = None
|
||||||
explode: Optional[bool] = None
|
explode: Optional[bool] = None
|
||||||
allowReserved: Optional[bool] = None
|
allowReserved: Optional[bool] = None
|
||||||
schema_: Optional[Union[Schema, Reference]] = PSchema(
|
schema_: Optional[Union[Schema, Reference]] = PSchema( # type: ignore
|
||||||
None, alias="schema"
|
None, alias="schema"
|
||||||
) # type: ignore
|
)
|
||||||
example: Optional[Any] = None
|
example: Optional[Any] = None
|
||||||
examples: Optional[Dict[str, Union[Example, Reference]]] = None
|
examples: Optional[Dict[str, Union[Example, Reference]]] = None
|
||||||
# Serialization rules for more complex scenarios
|
# Serialization rules for more complex scenarios
|
||||||
|
|
|
||||||
|
|
@ -71,7 +71,8 @@ def get_openapi_operation_parameters(
|
||||||
definitions: Dict[str, Dict] = {}
|
definitions: Dict[str, Dict] = {}
|
||||||
parameters = []
|
parameters = []
|
||||||
for param in all_route_params:
|
for param in all_route_params:
|
||||||
schema: Param = param.schema
|
schema = param.schema
|
||||||
|
schema = cast(Param, schema)
|
||||||
if "ValidationError" not in definitions:
|
if "ValidationError" not in definitions:
|
||||||
definitions["ValidationError"] = validation_error_definition
|
definitions["ValidationError"] = validation_error_definition
|
||||||
definitions["HTTPValidationError"] = validation_error_response_definition
|
definitions["HTTPValidationError"] = validation_error_response_definition
|
||||||
|
|
@ -90,7 +91,7 @@ def get_openapi_operation_parameters(
|
||||||
|
|
||||||
|
|
||||||
def get_openapi_operation_request_body(
|
def get_openapi_operation_request_body(
|
||||||
*, body_field: Field, model_name_map: Dict[Type, str]
|
*, body_field: Optional[Field], model_name_map: Dict[Type, str]
|
||||||
) -> Optional[Dict]:
|
) -> Optional[Dict]:
|
||||||
if not body_field:
|
if not body_field:
|
||||||
return None
|
return None
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
import asyncio
|
import asyncio
|
||||||
import inspect
|
import inspect
|
||||||
import logging
|
import logging
|
||||||
from typing import Any, Callable, Dict, List, Optional, Set, Type, Union
|
from typing import Any, Callable, Dict, List, Optional, Sequence, Set, Type, Union
|
||||||
|
|
||||||
from fastapi import params
|
from fastapi import params
|
||||||
from fastapi.dependencies.models import Dependant
|
from fastapi.dependencies.models import Dependant
|
||||||
|
|
@ -184,14 +184,14 @@ class APIRoute(routing.Route):
|
||||||
response_model: Type[Any] = None,
|
response_model: Type[Any] = None,
|
||||||
status_code: int = 200,
|
status_code: int = 200,
|
||||||
tags: List[str] = None,
|
tags: List[str] = None,
|
||||||
dependencies: List[params.Depends] = None,
|
dependencies: Sequence[params.Depends] = None,
|
||||||
summary: str = None,
|
summary: str = None,
|
||||||
description: str = None,
|
description: str = None,
|
||||||
response_description: str = "Successful Response",
|
response_description: str = "Successful Response",
|
||||||
responses: Dict[Union[int, str], Dict[str, Any]] = None,
|
responses: Dict[Union[int, str], Dict[str, Any]] = None,
|
||||||
deprecated: bool = None,
|
deprecated: bool = None,
|
||||||
name: str = None,
|
name: str = None,
|
||||||
methods: List[str] = None,
|
methods: Optional[Union[Set[str], List[str]]] = None,
|
||||||
operation_id: str = None,
|
operation_id: str = None,
|
||||||
response_model_include: Set[str] = None,
|
response_model_include: Set[str] = None,
|
||||||
response_model_exclude: Set[str] = set(),
|
response_model_exclude: Set[str] = set(),
|
||||||
|
|
@ -227,13 +227,18 @@ class APIRoute(routing.Route):
|
||||||
# would pass the validation and be returned as is.
|
# would pass the validation and be returned as is.
|
||||||
# By being a new field, no inheritance will be passed as is. A new model
|
# By being a new field, no inheritance will be passed as is. A new model
|
||||||
# will be always created.
|
# will be always created.
|
||||||
self.secure_cloned_response_field = create_cloned_field(self.response_field)
|
self.secure_cloned_response_field: Optional[Field] = create_cloned_field(
|
||||||
|
self.response_field
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
self.response_field = None
|
self.response_field = None
|
||||||
self.secure_cloned_response_field = None
|
self.secure_cloned_response_field = None
|
||||||
self.status_code = status_code
|
self.status_code = status_code
|
||||||
self.tags = tags or []
|
self.tags = tags or []
|
||||||
self.dependencies = dependencies or []
|
if dependencies:
|
||||||
|
self.dependencies = list(dependencies)
|
||||||
|
else:
|
||||||
|
self.dependencies = []
|
||||||
self.summary = summary
|
self.summary = summary
|
||||||
self.description = description or inspect.cleandoc(self.endpoint.__doc__ or "")
|
self.description = description or inspect.cleandoc(self.endpoint.__doc__ or "")
|
||||||
self.response_description = response_description
|
self.response_description = response_description
|
||||||
|
|
@ -264,7 +269,7 @@ class APIRoute(routing.Route):
|
||||||
self.deprecated = deprecated
|
self.deprecated = deprecated
|
||||||
if methods is None:
|
if methods is None:
|
||||||
methods = ["GET"]
|
methods = ["GET"]
|
||||||
self.methods = methods
|
self.methods = set([method.upper() for method in methods])
|
||||||
self.operation_id = operation_id
|
self.operation_id = operation_id
|
||||||
self.response_model_include = response_model_include
|
self.response_model_include = response_model_include
|
||||||
self.response_model_exclude = response_model_exclude
|
self.response_model_exclude = response_model_exclude
|
||||||
|
|
@ -322,13 +327,13 @@ class APIRouter(routing.Router):
|
||||||
response_model: Type[Any] = None,
|
response_model: Type[Any] = None,
|
||||||
status_code: int = 200,
|
status_code: int = 200,
|
||||||
tags: List[str] = None,
|
tags: List[str] = None,
|
||||||
dependencies: List[params.Depends] = None,
|
dependencies: Sequence[params.Depends] = None,
|
||||||
summary: str = None,
|
summary: str = None,
|
||||||
description: str = None,
|
description: str = None,
|
||||||
response_description: str = "Successful Response",
|
response_description: str = "Successful Response",
|
||||||
responses: Dict[Union[int, str], Dict[str, Any]] = None,
|
responses: Dict[Union[int, str], Dict[str, Any]] = None,
|
||||||
deprecated: bool = None,
|
deprecated: bool = None,
|
||||||
methods: List[str] = None,
|
methods: Optional[Union[Set[str], List[str]]] = None,
|
||||||
operation_id: str = None,
|
operation_id: str = None,
|
||||||
response_model_include: Set[str] = None,
|
response_model_include: Set[str] = None,
|
||||||
response_model_exclude: Set[str] = set(),
|
response_model_exclude: Set[str] = set(),
|
||||||
|
|
@ -344,7 +349,7 @@ class APIRouter(routing.Router):
|
||||||
response_model=response_model,
|
response_model=response_model,
|
||||||
status_code=status_code,
|
status_code=status_code,
|
||||||
tags=tags or [],
|
tags=tags or [],
|
||||||
dependencies=dependencies or [],
|
dependencies=dependencies,
|
||||||
summary=summary,
|
summary=summary,
|
||||||
description=description,
|
description=description,
|
||||||
response_description=response_description,
|
response_description=response_description,
|
||||||
|
|
@ -370,7 +375,7 @@ class APIRouter(routing.Router):
|
||||||
response_model: Type[Any] = None,
|
response_model: Type[Any] = None,
|
||||||
status_code: int = 200,
|
status_code: int = 200,
|
||||||
tags: List[str] = None,
|
tags: List[str] = None,
|
||||||
dependencies: List[params.Depends] = None,
|
dependencies: Sequence[params.Depends] = None,
|
||||||
summary: str = None,
|
summary: str = None,
|
||||||
description: str = None,
|
description: str = None,
|
||||||
response_description: str = "Successful Response",
|
response_description: str = "Successful Response",
|
||||||
|
|
@ -393,7 +398,7 @@ class APIRouter(routing.Router):
|
||||||
response_model=response_model,
|
response_model=response_model,
|
||||||
status_code=status_code,
|
status_code=status_code,
|
||||||
tags=tags or [],
|
tags=tags or [],
|
||||||
dependencies=dependencies or [],
|
dependencies=dependencies,
|
||||||
summary=summary,
|
summary=summary,
|
||||||
description=description,
|
description=description,
|
||||||
response_description=response_description,
|
response_description=response_description,
|
||||||
|
|
@ -432,7 +437,7 @@ class APIRouter(routing.Router):
|
||||||
*,
|
*,
|
||||||
prefix: str = "",
|
prefix: str = "",
|
||||||
tags: List[str] = None,
|
tags: List[str] = None,
|
||||||
dependencies: List[params.Depends] = None,
|
dependencies: Sequence[params.Depends] = None,
|
||||||
responses: Dict[Union[int, str], Dict[str, Any]] = None,
|
responses: Dict[Union[int, str], Dict[str, Any]] = None,
|
||||||
) -> None:
|
) -> None:
|
||||||
if prefix:
|
if prefix:
|
||||||
|
|
@ -451,7 +456,8 @@ class APIRouter(routing.Router):
|
||||||
response_model=route.response_model,
|
response_model=route.response_model,
|
||||||
status_code=route.status_code,
|
status_code=route.status_code,
|
||||||
tags=(route.tags or []) + (tags or []),
|
tags=(route.tags or []) + (tags or []),
|
||||||
dependencies=(dependencies or []) + (route.dependencies or []),
|
dependencies=list(dependencies or [])
|
||||||
|
+ list(route.dependencies or []),
|
||||||
summary=route.summary,
|
summary=route.summary,
|
||||||
description=route.description,
|
description=route.description,
|
||||||
response_description=route.response_description,
|
response_description=route.response_description,
|
||||||
|
|
@ -471,7 +477,7 @@ class APIRouter(routing.Router):
|
||||||
self.add_route(
|
self.add_route(
|
||||||
prefix + route.path,
|
prefix + route.path,
|
||||||
route.endpoint,
|
route.endpoint,
|
||||||
methods=route.methods,
|
methods=list(route.methods or []),
|
||||||
include_in_schema=route.include_in_schema,
|
include_in_schema=route.include_in_schema,
|
||||||
name=route.name,
|
name=route.name,
|
||||||
)
|
)
|
||||||
|
|
@ -491,7 +497,7 @@ class APIRouter(routing.Router):
|
||||||
response_model: Type[Any] = None,
|
response_model: Type[Any] = None,
|
||||||
status_code: int = 200,
|
status_code: int = 200,
|
||||||
tags: List[str] = None,
|
tags: List[str] = None,
|
||||||
dependencies: List[params.Depends] = None,
|
dependencies: Sequence[params.Depends] = None,
|
||||||
summary: str = None,
|
summary: str = None,
|
||||||
description: str = None,
|
description: str = None,
|
||||||
response_description: str = "Successful Response",
|
response_description: str = "Successful Response",
|
||||||
|
|
@ -512,7 +518,7 @@ class APIRouter(routing.Router):
|
||||||
response_model=response_model,
|
response_model=response_model,
|
||||||
status_code=status_code,
|
status_code=status_code,
|
||||||
tags=tags or [],
|
tags=tags or [],
|
||||||
dependencies=dependencies or [],
|
dependencies=dependencies,
|
||||||
summary=summary,
|
summary=summary,
|
||||||
description=description,
|
description=description,
|
||||||
response_description=response_description,
|
response_description=response_description,
|
||||||
|
|
@ -536,7 +542,7 @@ class APIRouter(routing.Router):
|
||||||
response_model: Type[Any] = None,
|
response_model: Type[Any] = None,
|
||||||
status_code: int = 200,
|
status_code: int = 200,
|
||||||
tags: List[str] = None,
|
tags: List[str] = None,
|
||||||
dependencies: List[params.Depends] = None,
|
dependencies: Sequence[params.Depends] = None,
|
||||||
summary: str = None,
|
summary: str = None,
|
||||||
description: str = None,
|
description: str = None,
|
||||||
response_description: str = "Successful Response",
|
response_description: str = "Successful Response",
|
||||||
|
|
@ -556,7 +562,7 @@ class APIRouter(routing.Router):
|
||||||
response_model=response_model,
|
response_model=response_model,
|
||||||
status_code=status_code,
|
status_code=status_code,
|
||||||
tags=tags or [],
|
tags=tags or [],
|
||||||
dependencies=dependencies or [],
|
dependencies=dependencies,
|
||||||
summary=summary,
|
summary=summary,
|
||||||
description=description,
|
description=description,
|
||||||
response_description=response_description,
|
response_description=response_description,
|
||||||
|
|
@ -580,7 +586,7 @@ class APIRouter(routing.Router):
|
||||||
response_model: Type[Any] = None,
|
response_model: Type[Any] = None,
|
||||||
status_code: int = 200,
|
status_code: int = 200,
|
||||||
tags: List[str] = None,
|
tags: List[str] = None,
|
||||||
dependencies: List[params.Depends] = None,
|
dependencies: Sequence[params.Depends] = None,
|
||||||
summary: str = None,
|
summary: str = None,
|
||||||
description: str = None,
|
description: str = None,
|
||||||
response_description: str = "Successful Response",
|
response_description: str = "Successful Response",
|
||||||
|
|
@ -600,7 +606,7 @@ class APIRouter(routing.Router):
|
||||||
response_model=response_model,
|
response_model=response_model,
|
||||||
status_code=status_code,
|
status_code=status_code,
|
||||||
tags=tags or [],
|
tags=tags or [],
|
||||||
dependencies=dependencies or [],
|
dependencies=dependencies,
|
||||||
summary=summary,
|
summary=summary,
|
||||||
description=description,
|
description=description,
|
||||||
response_description=response_description,
|
response_description=response_description,
|
||||||
|
|
@ -624,7 +630,7 @@ class APIRouter(routing.Router):
|
||||||
response_model: Type[Any] = None,
|
response_model: Type[Any] = None,
|
||||||
status_code: int = 200,
|
status_code: int = 200,
|
||||||
tags: List[str] = None,
|
tags: List[str] = None,
|
||||||
dependencies: List[params.Depends] = None,
|
dependencies: Sequence[params.Depends] = None,
|
||||||
summary: str = None,
|
summary: str = None,
|
||||||
description: str = None,
|
description: str = None,
|
||||||
response_description: str = "Successful Response",
|
response_description: str = "Successful Response",
|
||||||
|
|
@ -644,7 +650,7 @@ class APIRouter(routing.Router):
|
||||||
response_model=response_model,
|
response_model=response_model,
|
||||||
status_code=status_code,
|
status_code=status_code,
|
||||||
tags=tags or [],
|
tags=tags or [],
|
||||||
dependencies=dependencies or [],
|
dependencies=dependencies,
|
||||||
summary=summary,
|
summary=summary,
|
||||||
description=description,
|
description=description,
|
||||||
response_description=response_description,
|
response_description=response_description,
|
||||||
|
|
@ -668,7 +674,7 @@ class APIRouter(routing.Router):
|
||||||
response_model: Type[Any] = None,
|
response_model: Type[Any] = None,
|
||||||
status_code: int = 200,
|
status_code: int = 200,
|
||||||
tags: List[str] = None,
|
tags: List[str] = None,
|
||||||
dependencies: List[params.Depends] = None,
|
dependencies: Sequence[params.Depends] = None,
|
||||||
summary: str = None,
|
summary: str = None,
|
||||||
description: str = None,
|
description: str = None,
|
||||||
response_description: str = "Successful Response",
|
response_description: str = "Successful Response",
|
||||||
|
|
@ -688,7 +694,7 @@ class APIRouter(routing.Router):
|
||||||
response_model=response_model,
|
response_model=response_model,
|
||||||
status_code=status_code,
|
status_code=status_code,
|
||||||
tags=tags or [],
|
tags=tags or [],
|
||||||
dependencies=dependencies or [],
|
dependencies=dependencies,
|
||||||
summary=summary,
|
summary=summary,
|
||||||
description=description,
|
description=description,
|
||||||
response_description=response_description,
|
response_description=response_description,
|
||||||
|
|
@ -712,7 +718,7 @@ class APIRouter(routing.Router):
|
||||||
response_model: Type[Any] = None,
|
response_model: Type[Any] = None,
|
||||||
status_code: int = 200,
|
status_code: int = 200,
|
||||||
tags: List[str] = None,
|
tags: List[str] = None,
|
||||||
dependencies: List[params.Depends] = None,
|
dependencies: Sequence[params.Depends] = None,
|
||||||
summary: str = None,
|
summary: str = None,
|
||||||
description: str = None,
|
description: str = None,
|
||||||
response_description: str = "Successful Response",
|
response_description: str = "Successful Response",
|
||||||
|
|
@ -732,7 +738,7 @@ class APIRouter(routing.Router):
|
||||||
response_model=response_model,
|
response_model=response_model,
|
||||||
status_code=status_code,
|
status_code=status_code,
|
||||||
tags=tags or [],
|
tags=tags or [],
|
||||||
dependencies=dependencies or [],
|
dependencies=dependencies,
|
||||||
summary=summary,
|
summary=summary,
|
||||||
description=description,
|
description=description,
|
||||||
response_description=response_description,
|
response_description=response_description,
|
||||||
|
|
@ -756,7 +762,7 @@ class APIRouter(routing.Router):
|
||||||
response_model: Type[Any] = None,
|
response_model: Type[Any] = None,
|
||||||
status_code: int = 200,
|
status_code: int = 200,
|
||||||
tags: List[str] = None,
|
tags: List[str] = None,
|
||||||
dependencies: List[params.Depends] = None,
|
dependencies: Sequence[params.Depends] = None,
|
||||||
summary: str = None,
|
summary: str = None,
|
||||||
description: str = None,
|
description: str = None,
|
||||||
response_description: str = "Successful Response",
|
response_description: str = "Successful Response",
|
||||||
|
|
@ -776,7 +782,7 @@ class APIRouter(routing.Router):
|
||||||
response_model=response_model,
|
response_model=response_model,
|
||||||
status_code=status_code,
|
status_code=status_code,
|
||||||
tags=tags or [],
|
tags=tags or [],
|
||||||
dependencies=dependencies or [],
|
dependencies=dependencies,
|
||||||
summary=summary,
|
summary=summary,
|
||||||
description=description,
|
description=description,
|
||||||
response_description=response_description,
|
response_description=response_description,
|
||||||
|
|
@ -800,7 +806,7 @@ class APIRouter(routing.Router):
|
||||||
response_model: Type[Any] = None,
|
response_model: Type[Any] = None,
|
||||||
status_code: int = 200,
|
status_code: int = 200,
|
||||||
tags: List[str] = None,
|
tags: List[str] = None,
|
||||||
dependencies: List[params.Depends] = None,
|
dependencies: Sequence[params.Depends] = None,
|
||||||
summary: str = None,
|
summary: str = None,
|
||||||
description: str = None,
|
description: str = None,
|
||||||
response_description: str = "Successful Response",
|
response_description: str = "Successful Response",
|
||||||
|
|
@ -820,7 +826,7 @@ class APIRouter(routing.Router):
|
||||||
response_model=response_model,
|
response_model=response_model,
|
||||||
status_code=status_code,
|
status_code=status_code,
|
||||||
tags=tags or [],
|
tags=tags or [],
|
||||||
dependencies=dependencies or [],
|
dependencies=dependencies,
|
||||||
summary=summary,
|
summary=summary,
|
||||||
description=description,
|
description=description,
|
||||||
response_description=response_description,
|
response_description=response_description,
|
||||||
|
|
|
||||||
|
|
@ -54,7 +54,7 @@ class APIKeyCookie(APIKeyBase):
|
||||||
self.auto_error = auto_error
|
self.auto_error = auto_error
|
||||||
|
|
||||||
async def __call__(self, request: Request) -> Optional[str]:
|
async def __call__(self, request: Request) -> Optional[str]:
|
||||||
api_key: str = request.cookies.get(self.model.name)
|
api_key = request.cookies.get(self.model.name)
|
||||||
if not api_key:
|
if not api_key:
|
||||||
if self.auto_error:
|
if self.auto_error:
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,9 @@ class HTTPBasic(HTTPBase):
|
||||||
self.realm = realm
|
self.realm = realm
|
||||||
self.auto_error = auto_error
|
self.auto_error = auto_error
|
||||||
|
|
||||||
async def __call__(self, request: Request) -> Optional[HTTPBasicCredentials]:
|
async def __call__( # type: ignore
|
||||||
|
self, request: Request
|
||||||
|
) -> Optional[HTTPBasicCredentials]:
|
||||||
authorization: str = request.headers.get("Authorization")
|
authorization: str = request.headers.get("Authorization")
|
||||||
scheme, param = get_authorization_scheme_param(authorization)
|
scheme, param = get_authorization_scheme_param(authorization)
|
||||||
if self.realm:
|
if self.realm:
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ from typing import List, Optional
|
||||||
|
|
||||||
from fastapi.exceptions import HTTPException
|
from fastapi.exceptions import HTTPException
|
||||||
from fastapi.openapi.models import OAuth2 as OAuth2Model, OAuthFlows as OAuthFlowsModel
|
from fastapi.openapi.models import OAuth2 as OAuth2Model, OAuthFlows as OAuthFlowsModel
|
||||||
from fastapi.params import Form
|
from fastapi.param_functions import Form
|
||||||
from fastapi.security.base import SecurityBase
|
from fastapi.security.base import SecurityBase
|
||||||
from fastapi.security.utils import get_authorization_scheme_param
|
from fastapi.security.utils import get_authorization_scheme_param
|
||||||
from starlette.requests import Request
|
from starlette.requests import Request
|
||||||
|
|
|
||||||
|
|
@ -10,9 +10,7 @@ from pydantic.utils import lenient_issubclass
|
||||||
from starlette.routing import BaseRoute
|
from starlette.routing import BaseRoute
|
||||||
|
|
||||||
|
|
||||||
def get_flat_models_from_routes(
|
def get_flat_models_from_routes(routes: Sequence[BaseRoute]) -> Set[Type[BaseModel]]:
|
||||||
routes: Sequence[Type[BaseRoute]]
|
|
||||||
) -> Set[Type[BaseModel]]:
|
|
||||||
body_fields_from_routes: List[Field] = []
|
body_fields_from_routes: List[Field] = []
|
||||||
responses_from_routes: List[Field] = []
|
responses_from_routes: List[Field] = []
|
||||||
for route in routes:
|
for route in routes:
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,6 @@
|
||||||
set -e
|
set -e
|
||||||
set -x
|
set -x
|
||||||
|
|
||||||
mypy fastapi --disallow-untyped-defs --follow-imports=skip
|
mypy fastapi --disallow-untyped-defs
|
||||||
black fastapi tests --check
|
black fastapi tests --check
|
||||||
isort --multi-line=3 --trailing-comma --force-grid-wrap=0 --combine-as --line-width 88 --recursive --check-only --thirdparty fastapi fastapi tests
|
isort --multi-line=3 --trailing-comma --force-grid-wrap=0 --combine-as --line-width 88 --recursive --check-only --thirdparty fastapi fastapi tests
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue