Upgrading fastapi 0.111 to 0.112
Breaking0.111.1 → 0.112.4Breaking1Security1New1Changed6Fixed3Other120
BreakingUpgrade verdict
1 breaking change and a security fix.
In plain terms
- Installing fastapi no longer brings Uvicorn and the CLI automatically. You now need to install the standard extra to get them.
- Updates permissions for the deploy-docs action.
Must act 2 items need code or config changes
Drops email-validator, fastapi-cli, httpx, jinja2, python-multipart, uvicorn.
Installs 8 packages in all (was 34).
What you must change
Breaking1
Moves standard dependencies (Uvicorn, fastapi-cli) out of the default install; they now require the standard extra.
fastapi[standard]fastapi-cli[standard]python -m fastapiSecurity1
Updates permissions for the deploy-docs action.
API changes
Generated by DepDelta from published Python source. Not mixed with prose notes.
- changed:
method FastAPI.add_api_route(path: str, endpoint: Callable[..., Coroutine[Any, Any, Response]], *, response_model: Any=…, status_code: Optional[int]=…, tags: Optional[List[Union[str, Enum]]]=…, dependencies: Optional[Sequence[Depends]]=…, summary: Optional[str]=…, description: Optional[str]=…, response_description: str=…, responses: Optional[Dict[Union[int, str], Dict[str, Any]]]=…, deprecated: O… → method FastAPI.add_api_route(path: str, endpoint: Callable[..., Any], *, response_model: Any=…, status_code: Optional[int]=…, tags: Optional[List[Union[str, Enum]]]=…, dependencies: Optional[Sequence[Depends]]=…, summary: Optional[str]=…, description: Optional[str]=…, response_description: str=…, responses: Optional[Dict[Union[int, str], Dict[str, Any]]]=…, deprecated: Optional[bool]=…, methods:…
- added:
function main() -> None - added:
variable cli_main
- removed:
constructor Dependant(*, path_params: Optional[List[ModelField]]=…, query_params: Optional[List[ModelField]]=…, header_params: Optional[List[ModelField]]=…, cookie_params: Optional[List[ModelField]]=…, body_params: Optional[List[ModelField]]=…, dependencies: Optional[List[Dependant]]=…, security_schemes: Optional[List[SecurityRequirement]]=…, name: Optional[str]=…, call: Optional[Callable[..., An… - removed:
constructor SecurityRequirement(security_scheme: SecurityBase, scopes: Optional[Sequence[str]]=…) - added:
field Dependant.background_tasks_param_name: Optional[str] - added:
field Dependant.body_params: List[ModelField] - added:
field Dependant.cache_key: Tuple[Optional[Callable[..., Any]], Tuple[str, ...]] - added:
field Dependant.call: Optional[Callable[..., Any]] - added:
field Dependant.cookie_params: List[ModelField] - added:
field Dependant.dependencies: List[Dependant] - added:
field Dependant.header_params: List[ModelField] - added:
field Dependant.http_connection_param_name: Optional[str] - added:
field Dependant.name: Optional[str] - added:
field Dependant.path: Optional[str] - added:
field Dependant.path_params: List[ModelField] - added:
field Dependant.query_params: List[ModelField] - added:
field Dependant.request_param_name: Optional[str] - added:
field Dependant.response_param_name: Optional[str] - added:
field Dependant.security_requirements: List[SecurityRequirement] - added:
field Dependant.security_scopes: Optional[List[str]] - added:
field Dependant.security_scopes_param_name: Optional[str] - added:
field Dependant.use_cache: bool - added:
field Dependant.websocket_param_name: Optional[str] - added:
field SecurityRequirement.scopes: Optional[Sequence[str]] - added:
field SecurityRequirement.security_scheme: SecurityBase
- removed:
function check_file_field(field: ModelField) -> None - removed:
function is_body_param(*, param_field: ModelField, is_path_param: bool) -> bool - changed:
async function request_body_to_args(required_params: List[ModelField], received_body: Optional[Union[Dict[str, Any], FormData]]) -> Tuple[Dict[str, Any], List[Dict[str, Any]]] → async function request_body_to_args(body_fields: List[ModelField], received_body: Optional[Union[Dict[str, Any], FormData]], embed_body_fields: bool) -> Tuple[Dict[str, Any], List[Dict[str, Any]]] - changed:
async function solve_dependencies(*, request: Union[Request, WebSocket], dependant: Dependant, body: Optional[Union[Dict[str, Any], FormData]]=…, background_tasks: Optional[StarletteBackgroundTasks]=…, response: Optional[Response]=…, dependency_overrides_provider: Optional[Any]=…, dependency_cache: Optional[Dict[Tuple[Callable[..., Any], Tuple[str]], Any]]=…, async_exit_stack: AsyncExitStack) ->… → async function solve_dependencies(*, request: Union[Request, WebSocket], dependant: Dependant, body: Optional[Union[Dict[str, Any], FormData]]=…, background_tasks: Optional[StarletteBackgroundTasks]=…, response: Optional[Response]=…, dependency_overrides_provider: Optional[Any]=…, dependency_cache: Optional[Dict[Tuple[Callable[..., Any], Tuple[str]], Any]]=…, async_exit_stack: AsyncExitStack, emb… - changed:
function analyze_param(*, param_name: str, annotation: Any, value: Any, is_path_param: bool) -> Tuple[Any, Optional[params.Depends], Optional[ModelField]] → function analyze_param(*, param_name: str, annotation: Any, value: Any, is_path_param: bool) -> ParamDetails - changed:
function get_body_field(*, dependant: Dependant, name: str) -> Optional[ModelField] → function get_body_field(*, flat_dependant: Dependant, name: str, embed_body_fields: bool) -> Optional[ModelField] - changed:
function request_params_to_args(required_params: Sequence[ModelField], received_params: Union[Mapping[str, Any], QueryParams, Headers]) -> Tuple[Dict[str, Any], List[Any]] → function request_params_to_args(fields: Sequence[ModelField], received_params: Union[Mapping[str, Any], QueryParams, Headers]) -> Tuple[Dict[str, Any], List[Any]] - added:
class ParamDetails - added:
class SolvedDependency - added:
field ParamDetails.depends: Optional[params.Depends] - added:
field ParamDetails.field: Optional[ModelField] - added:
field ParamDetails.type_annotation: Any - added:
field SolvedDependency.background_tasks: Optional[StarletteBackgroundTasks] - added:
field SolvedDependency.dependency_cache: Dict[Tuple[Callable[..., Any], Tuple[str]], Any] - added:
field SolvedDependency.errors: List[Any] - added:
field SolvedDependency.response: Response - added:
field SolvedDependency.values: Dict[str, Any] - added:
function ensure_multipart_is_installed() -> None
- changed:
constructor Body(default: Any=…, *, default_factory: Union[Callable[[], Any], None]=…, annotation: Optional[Any]=…, embed: bool=…, media_type: str=…, alias: Optional[str]=…, alias_priority: Union[int, None]=…, validation_alias: Union[str, None]=…, serialization_alias: Union[str, None]=…, title: Optional[str]=…, description: Optional[str]=…, gt: Optional[float]=…, ge: Optional[float]=…, lt: Option… → constructor Body(default: Any=…, *, default_factory: Union[Callable[[], Any], None]=…, annotation: Optional[Any]=…, embed: Union[bool, None]=…, media_type: str=…, alias: Optional[str]=…, alias_priority: Union[int, None]=…, validation_alias: Union[str, None]=…, serialization_alias: Union[str, None]=…, title: Optional[str]=…, description: Optional[str]=…, gt: Optional[float]=…, ge: Optional[float]=…
- changed:
function get_websocket_app(dependant: Dependant, dependency_overrides_provider: Optional[Any]=…) -> Callable[[WebSocket], Coroutine[Any, Any, Any]] → function get_websocket_app(dependant: Dependant, dependency_overrides_provider: Optional[Any]=…, embed_body_fields: bool=…) -> Callable[[WebSocket], Coroutine[Any, Any, Any]]
- removed:
function create_response_field(name: str, type_: Type[Any], class_validators: Optional[Dict[str, Validator]]=…, default: Optional[Any]=…, required: Union[bool, UndefinedType]=…, model_config: Type[BaseConfig]=…, field_info: Optional[FieldInfo]=…, alias: Optional[str]=…, mode: Literal['validation', 'serialization']=…) -> ModelField - added:
function create_model_field(name: str, type_: Any, class_validators: Optional[Dict[str, Validator]]=…, default: Optional[Any]=…, required: Union[bool, UndefinedType]=…, model_config: Type[BaseConfig]=…, field_info: Optional[FieldInfo]=…, alias: Optional[str]=…, mode: Literal['validation', 'serialization']=…) -> ModelField