| import contextlib
|
| import email.message
|
| import functools
|
| import inspect
|
| import json
|
| import types
|
| from collections.abc import (
|
| AsyncIterator,
|
| Awaitable,
|
| Collection,
|
| Coroutine,
|
| Generator,
|
| Mapping,
|
| Sequence,
|
| )
|
| from contextlib import (
|
| AbstractAsyncContextManager,
|
| AbstractContextManager,
|
| AsyncExitStack,
|
| asynccontextmanager,
|
| )
|
| from enum import Enum, IntEnum
|
| from typing import (
|
| Annotated,
|
| Any,
|
| Callable,
|
| Optional,
|
| TypeVar,
|
| Union,
|
| )
|
|
|
| from annotated_doc import Doc
|
| from fastapi import params
|
| from fastapi._compat import (
|
| ModelField,
|
| Undefined,
|
| lenient_issubclass,
|
| )
|
| from fastapi.datastructures import Default, DefaultPlaceholder
|
| from fastapi.dependencies.models import Dependant
|
| from fastapi.dependencies.utils import (
|
| _should_embed_body_fields,
|
| get_body_field,
|
| get_dependant,
|
| get_flat_dependant,
|
| get_parameterless_sub_dependant,
|
| get_typed_return_annotation,
|
| solve_dependencies,
|
| )
|
| from fastapi.encoders import jsonable_encoder
|
| from fastapi.exceptions import (
|
| EndpointContext,
|
| FastAPIError,
|
| RequestValidationError,
|
| ResponseValidationError,
|
| WebSocketRequestValidationError,
|
| )
|
| from fastapi.types import DecoratedCallable, IncEx
|
| from fastapi.utils import (
|
| create_model_field,
|
| generate_unique_id,
|
| get_value_or_default,
|
| is_body_allowed_for_status_code,
|
| )
|
| from starlette import routing
|
| from starlette._exception_handler import wrap_app_handling_exceptions
|
| from starlette._utils import is_async_callable
|
| from starlette.concurrency import run_in_threadpool
|
| from starlette.exceptions import HTTPException
|
| from starlette.requests import Request
|
| from starlette.responses import JSONResponse, Response
|
| from starlette.routing import (
|
| BaseRoute,
|
| Match,
|
| compile_path,
|
| get_name,
|
| )
|
| from starlette.routing import Mount as Mount
|
| from starlette.types import AppType, ASGIApp, Lifespan, Receive, Scope, Send
|
| from starlette.websockets import WebSocket
|
| from typing_extensions import deprecated
|
|
|
|
|
|
|
|
|
| def request_response(
|
| func: Callable[[Request], Union[Awaitable[Response], Response]],
|
| ) -> ASGIApp:
|
| """
|
| Takes a function or coroutine `func(request) -> response`,
|
| and returns an ASGI application.
|
| """
|
| f: Callable[[Request], Awaitable[Response]] = (
|
| func if is_async_callable(func) else functools.partial(run_in_threadpool, func)
|
| )
|
|
|
| async def app(scope: Scope, receive: Receive, send: Send) -> None:
|
| request = Request(scope, receive, send)
|
|
|
| async def app(scope: Scope, receive: Receive, send: Send) -> None:
|
|
|
| response_awaited = False
|
| async with AsyncExitStack() as request_stack:
|
| scope["fastapi_inner_astack"] = request_stack
|
| async with AsyncExitStack() as function_stack:
|
| scope["fastapi_function_astack"] = function_stack
|
| response = await f(request)
|
| await response(scope, receive, send)
|
|
|
| response_awaited = True
|
| if not response_awaited:
|
| raise FastAPIError(
|
| "Response not awaited. There's a high chance that the "
|
| "application code is raising an exception and a dependency with yield "
|
| "has a block with a bare except, or a block with except Exception, "
|
| "and is not raising the exception again. Read more about it in the "
|
| "docs: https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-with-yield/#dependencies-with-yield-and-except"
|
| )
|
|
|
|
|
| await wrap_app_handling_exceptions(app, request)(scope, receive, send)
|
|
|
| return app
|
|
|
|
|
|
|
|
|
| def websocket_session(
|
| func: Callable[[WebSocket], Awaitable[None]],
|
| ) -> ASGIApp:
|
| """
|
| Takes a coroutine `func(session)`, and returns an ASGI application.
|
| """
|
|
|
|
|
| async def app(scope: Scope, receive: Receive, send: Send) -> None:
|
| session = WebSocket(scope, receive=receive, send=send)
|
|
|
| async def app(scope: Scope, receive: Receive, send: Send) -> None:
|
| async with AsyncExitStack() as request_stack:
|
| scope["fastapi_inner_astack"] = request_stack
|
| async with AsyncExitStack() as function_stack:
|
| scope["fastapi_function_astack"] = function_stack
|
| await func(session)
|
|
|
|
|
| await wrap_app_handling_exceptions(app, session)(scope, receive, send)
|
|
|
| return app
|
|
|
|
|
| _T = TypeVar("_T")
|
|
|
|
|
|
|
| class _AsyncLiftContextManager(AbstractAsyncContextManager[_T]):
|
| """
|
| Wraps a synchronous context manager to make it async.
|
|
|
| This is vendored from Starlette to avoid importing private symbols.
|
| """
|
|
|
| def __init__(self, cm: AbstractContextManager[_T]) -> None:
|
| self._cm = cm
|
|
|
| async def __aenter__(self) -> _T:
|
| return self._cm.__enter__()
|
|
|
| async def __aexit__(
|
| self,
|
| exc_type: Optional[type[BaseException]],
|
| exc_value: Optional[BaseException],
|
| traceback: Optional[types.TracebackType],
|
| ) -> Optional[bool]:
|
| return self._cm.__exit__(exc_type, exc_value, traceback)
|
|
|
|
|
|
|
| def _wrap_gen_lifespan_context(
|
| lifespan_context: Callable[[Any], Generator[Any, Any, Any]],
|
| ) -> Callable[[Any], AbstractAsyncContextManager[Any]]:
|
| """
|
| Wrap a generator-based lifespan context into an async context manager.
|
|
|
| This is vendored from Starlette to avoid importing private symbols.
|
| """
|
| cmgr = contextlib.contextmanager(lifespan_context)
|
|
|
| @functools.wraps(cmgr)
|
| def wrapper(app: Any) -> _AsyncLiftContextManager[Any]:
|
| return _AsyncLiftContextManager(cmgr(app))
|
|
|
| return wrapper
|
|
|
|
|
| def _merge_lifespan_context(
|
| original_context: Lifespan[Any], nested_context: Lifespan[Any]
|
| ) -> Lifespan[Any]:
|
| @asynccontextmanager
|
| async def merged_lifespan(
|
| app: AppType,
|
| ) -> AsyncIterator[Optional[Mapping[str, Any]]]:
|
| async with original_context(app) as maybe_original_state:
|
| async with nested_context(app) as maybe_nested_state:
|
| if maybe_nested_state is None and maybe_original_state is None:
|
| yield None
|
| else:
|
| yield {**(maybe_nested_state or {}), **(maybe_original_state or {})}
|
|
|
| return merged_lifespan
|
|
|
|
|
| class _DefaultLifespan:
|
| """
|
| Default lifespan context manager that runs on_startup and on_shutdown handlers.
|
|
|
| This is a copy of the Starlette _DefaultLifespan class that was removed
|
| in Starlette. FastAPI keeps it to maintain backward compatibility with
|
| on_startup and on_shutdown event handlers.
|
|
|
| Ref: https://github.com/Kludex/starlette/pull/3117
|
| """
|
|
|
| def __init__(self, router: "APIRouter") -> None:
|
| self._router = router
|
|
|
| async def __aenter__(self) -> None:
|
| await self._router._startup()
|
|
|
| async def __aexit__(self, *exc_info: object) -> None:
|
| await self._router._shutdown()
|
|
|
| def __call__(self: _T, app: object) -> _T:
|
| return self
|
|
|
|
|
|
|
| _endpoint_context_cache: dict[int, EndpointContext] = {}
|
|
|
|
|
| def _extract_endpoint_context(func: Any) -> EndpointContext:
|
| """Extract endpoint context with caching to avoid repeated file I/O."""
|
| func_id = id(func)
|
|
|
| if func_id in _endpoint_context_cache:
|
| return _endpoint_context_cache[func_id]
|
|
|
| try:
|
| ctx: EndpointContext = {}
|
|
|
| if (source_file := inspect.getsourcefile(func)) is not None:
|
| ctx["file"] = source_file
|
| if (line_number := inspect.getsourcelines(func)[1]) is not None:
|
| ctx["line"] = line_number
|
| if (func_name := getattr(func, "__name__", None)) is not None:
|
| ctx["function"] = func_name
|
| except Exception:
|
| ctx = EndpointContext()
|
|
|
| _endpoint_context_cache[func_id] = ctx
|
| return ctx
|
|
|
|
|
| async def serialize_response(
|
| *,
|
| field: Optional[ModelField] = None,
|
| response_content: Any,
|
| include: Optional[IncEx] = None,
|
| exclude: Optional[IncEx] = None,
|
| by_alias: bool = True,
|
| exclude_unset: bool = False,
|
| exclude_defaults: bool = False,
|
| exclude_none: bool = False,
|
| is_coroutine: bool = True,
|
| endpoint_ctx: Optional[EndpointContext] = None,
|
| ) -> Any:
|
| if field:
|
| if is_coroutine:
|
| value, errors = field.validate(response_content, {}, loc=("response",))
|
| else:
|
| value, errors = await run_in_threadpool(
|
| field.validate, response_content, {}, loc=("response",)
|
| )
|
| if errors:
|
| ctx = endpoint_ctx or EndpointContext()
|
| raise ResponseValidationError(
|
| errors=errors,
|
| body=response_content,
|
| endpoint_ctx=ctx,
|
| )
|
|
|
| return field.serialize(
|
| value,
|
| include=include,
|
| exclude=exclude,
|
| by_alias=by_alias,
|
| exclude_unset=exclude_unset,
|
| exclude_defaults=exclude_defaults,
|
| exclude_none=exclude_none,
|
| )
|
|
|
| else:
|
| return jsonable_encoder(response_content)
|
|
|
|
|
| async def run_endpoint_function(
|
| *, dependant: Dependant, values: dict[str, Any], is_coroutine: bool
|
| ) -> Any:
|
|
|
|
|
| assert dependant.call is not None, "dependant.call must be a function"
|
|
|
| if is_coroutine:
|
| return await dependant.call(**values)
|
| else:
|
| return await run_in_threadpool(dependant.call, **values)
|
|
|
|
|
| def get_request_handler(
|
| dependant: Dependant,
|
| body_field: Optional[ModelField] = None,
|
| status_code: Optional[int] = None,
|
| response_class: Union[type[Response], DefaultPlaceholder] = Default(JSONResponse),
|
| response_field: Optional[ModelField] = None,
|
| response_model_include: Optional[IncEx] = None,
|
| response_model_exclude: Optional[IncEx] = None,
|
| response_model_by_alias: bool = True,
|
| response_model_exclude_unset: bool = False,
|
| response_model_exclude_defaults: bool = False,
|
| response_model_exclude_none: bool = False,
|
| dependency_overrides_provider: Optional[Any] = None,
|
| embed_body_fields: bool = False,
|
| ) -> Callable[[Request], Coroutine[Any, Any, Response]]:
|
| assert dependant.call is not None, "dependant.call must be a function"
|
| is_coroutine = dependant.is_coroutine_callable
|
| is_body_form = body_field and isinstance(body_field.field_info, params.Form)
|
| if isinstance(response_class, DefaultPlaceholder):
|
| actual_response_class: type[Response] = response_class.value
|
| else:
|
| actual_response_class = response_class
|
|
|
| async def app(request: Request) -> Response:
|
| response: Union[Response, None] = None
|
| file_stack = request.scope.get("fastapi_middleware_astack")
|
| assert isinstance(file_stack, AsyncExitStack), (
|
| "fastapi_middleware_astack not found in request scope"
|
| )
|
|
|
|
|
| endpoint_ctx = (
|
| _extract_endpoint_context(dependant.call)
|
| if dependant.call
|
| else EndpointContext()
|
| )
|
|
|
| if dependant.path:
|
|
|
| mount_path = request.scope.get("root_path", "").rstrip("/")
|
| endpoint_ctx["path"] = f"{request.method} {mount_path}{dependant.path}"
|
|
|
|
|
| try:
|
| body: Any = None
|
| if body_field:
|
| if is_body_form:
|
| body = await request.form()
|
| file_stack.push_async_callback(body.close)
|
| else:
|
| body_bytes = await request.body()
|
| if body_bytes:
|
| json_body: Any = Undefined
|
| content_type_value = request.headers.get("content-type")
|
| if not content_type_value:
|
| json_body = await request.json()
|
| else:
|
| message = email.message.Message()
|
| message["content-type"] = content_type_value
|
| if message.get_content_maintype() == "application":
|
| subtype = message.get_content_subtype()
|
| if subtype == "json" or subtype.endswith("+json"):
|
| json_body = await request.json()
|
| if json_body != Undefined:
|
| body = json_body
|
| else:
|
| body = body_bytes
|
| except json.JSONDecodeError as e:
|
| validation_error = RequestValidationError(
|
| [
|
| {
|
| "type": "json_invalid",
|
| "loc": ("body", e.pos),
|
| "msg": "JSON decode error",
|
| "input": {},
|
| "ctx": {"error": e.msg},
|
| }
|
| ],
|
| body=e.doc,
|
| endpoint_ctx=endpoint_ctx,
|
| )
|
| raise validation_error from e
|
| except HTTPException:
|
|
|
| raise
|
| except Exception as e:
|
| http_error = HTTPException(
|
| status_code=400, detail="There was an error parsing the body"
|
| )
|
| raise http_error from e
|
|
|
|
|
| errors: list[Any] = []
|
| async_exit_stack = request.scope.get("fastapi_inner_astack")
|
| assert isinstance(async_exit_stack, AsyncExitStack), (
|
| "fastapi_inner_astack not found in request scope"
|
| )
|
| solved_result = await solve_dependencies(
|
| request=request,
|
| dependant=dependant,
|
| body=body,
|
| dependency_overrides_provider=dependency_overrides_provider,
|
| async_exit_stack=async_exit_stack,
|
| embed_body_fields=embed_body_fields,
|
| )
|
| errors = solved_result.errors
|
| if not errors:
|
| raw_response = await run_endpoint_function(
|
| dependant=dependant,
|
| values=solved_result.values,
|
| is_coroutine=is_coroutine,
|
| )
|
| if isinstance(raw_response, Response):
|
| if raw_response.background is None:
|
| raw_response.background = solved_result.background_tasks
|
| response = raw_response
|
| else:
|
| response_args: dict[str, Any] = {
|
| "background": solved_result.background_tasks
|
| }
|
|
|
|
|
| current_status_code = (
|
| status_code if status_code else solved_result.response.status_code
|
| )
|
| if current_status_code is not None:
|
| response_args["status_code"] = current_status_code
|
| if solved_result.response.status_code:
|
| response_args["status_code"] = solved_result.response.status_code
|
| content = await serialize_response(
|
| field=response_field,
|
| response_content=raw_response,
|
| include=response_model_include,
|
| exclude=response_model_exclude,
|
| by_alias=response_model_by_alias,
|
| exclude_unset=response_model_exclude_unset,
|
| exclude_defaults=response_model_exclude_defaults,
|
| exclude_none=response_model_exclude_none,
|
| is_coroutine=is_coroutine,
|
| endpoint_ctx=endpoint_ctx,
|
| )
|
| response = actual_response_class(content, **response_args)
|
| if not is_body_allowed_for_status_code(response.status_code):
|
| response.body = b""
|
| response.headers.raw.extend(solved_result.response.headers.raw)
|
| if errors:
|
| validation_error = RequestValidationError(
|
| errors, body=body, endpoint_ctx=endpoint_ctx
|
| )
|
| raise validation_error
|
|
|
|
|
| assert response
|
| return response
|
|
|
| return app
|
|
|
|
|
| def get_websocket_app(
|
| dependant: Dependant,
|
| dependency_overrides_provider: Optional[Any] = None,
|
| embed_body_fields: bool = False,
|
| ) -> Callable[[WebSocket], Coroutine[Any, Any, Any]]:
|
| async def app(websocket: WebSocket) -> None:
|
| endpoint_ctx = (
|
| _extract_endpoint_context(dependant.call)
|
| if dependant.call
|
| else EndpointContext()
|
| )
|
| if dependant.path:
|
|
|
| mount_path = websocket.scope.get("root_path", "").rstrip("/")
|
| endpoint_ctx["path"] = f"WS {mount_path}{dependant.path}"
|
| async_exit_stack = websocket.scope.get("fastapi_inner_astack")
|
| assert isinstance(async_exit_stack, AsyncExitStack), (
|
| "fastapi_inner_astack not found in request scope"
|
| )
|
| solved_result = await solve_dependencies(
|
| request=websocket,
|
| dependant=dependant,
|
| dependency_overrides_provider=dependency_overrides_provider,
|
| async_exit_stack=async_exit_stack,
|
| embed_body_fields=embed_body_fields,
|
| )
|
| if solved_result.errors:
|
| raise WebSocketRequestValidationError(
|
| solved_result.errors,
|
| endpoint_ctx=endpoint_ctx,
|
| )
|
| assert dependant.call is not None, "dependant.call must be a function"
|
| await dependant.call(**solved_result.values)
|
|
|
| return app
|
|
|
|
|
| class APIWebSocketRoute(routing.WebSocketRoute):
|
| def __init__(
|
| self,
|
| path: str,
|
| endpoint: Callable[..., Any],
|
| *,
|
| name: Optional[str] = None,
|
| dependencies: Optional[Sequence[params.Depends]] = None,
|
| dependency_overrides_provider: Optional[Any] = None,
|
| ) -> None:
|
| self.path = path
|
| self.endpoint = endpoint
|
| self.name = get_name(endpoint) if name is None else name
|
| self.dependencies = list(dependencies or [])
|
| self.path_regex, self.path_format, self.param_convertors = compile_path(path)
|
| self.dependant = get_dependant(
|
| path=self.path_format, call=self.endpoint, scope="function"
|
| )
|
| for depends in self.dependencies[::-1]:
|
| self.dependant.dependencies.insert(
|
| 0,
|
| get_parameterless_sub_dependant(depends=depends, path=self.path_format),
|
| )
|
| self._flat_dependant = get_flat_dependant(self.dependant)
|
| self._embed_body_fields = _should_embed_body_fields(
|
| self._flat_dependant.body_params
|
| )
|
| self.app = websocket_session(
|
| get_websocket_app(
|
| dependant=self.dependant,
|
| dependency_overrides_provider=dependency_overrides_provider,
|
| embed_body_fields=self._embed_body_fields,
|
| )
|
| )
|
|
|
| def matches(self, scope: Scope) -> tuple[Match, Scope]:
|
| match, child_scope = super().matches(scope)
|
| if match != Match.NONE:
|
| child_scope["route"] = self
|
| return match, child_scope
|
|
|
|
|
| class APIRoute(routing.Route):
|
| def __init__(
|
| self,
|
| path: str,
|
| endpoint: Callable[..., Any],
|
| *,
|
| response_model: Any = Default(None),
|
| status_code: Optional[int] = None,
|
| tags: Optional[list[Union[str, Enum]]] = None,
|
| dependencies: Optional[Sequence[params.Depends]] = None,
|
| summary: Optional[str] = None,
|
| description: Optional[str] = None,
|
| response_description: str = "Successful Response",
|
| responses: Optional[dict[Union[int, str], dict[str, Any]]] = None,
|
| deprecated: Optional[bool] = None,
|
| name: Optional[str] = None,
|
| methods: Optional[Union[set[str], list[str]]] = None,
|
| operation_id: Optional[str] = None,
|
| response_model_include: Optional[IncEx] = None,
|
| response_model_exclude: Optional[IncEx] = None,
|
| response_model_by_alias: bool = True,
|
| response_model_exclude_unset: bool = False,
|
| response_model_exclude_defaults: bool = False,
|
| response_model_exclude_none: bool = False,
|
| include_in_schema: bool = True,
|
| response_class: Union[type[Response], DefaultPlaceholder] = Default(
|
| JSONResponse
|
| ),
|
| dependency_overrides_provider: Optional[Any] = None,
|
| callbacks: Optional[list[BaseRoute]] = None,
|
| openapi_extra: Optional[dict[str, Any]] = None,
|
| generate_unique_id_function: Union[
|
| Callable[["APIRoute"], str], DefaultPlaceholder
|
| ] = Default(generate_unique_id),
|
| ) -> None:
|
| self.path = path
|
| self.endpoint = endpoint
|
| if isinstance(response_model, DefaultPlaceholder):
|
| return_annotation = get_typed_return_annotation(endpoint)
|
| if lenient_issubclass(return_annotation, Response):
|
| response_model = None
|
| else:
|
| response_model = return_annotation
|
| self.response_model = response_model
|
| self.summary = summary
|
| self.response_description = response_description
|
| self.deprecated = deprecated
|
| self.operation_id = operation_id
|
| self.response_model_include = response_model_include
|
| self.response_model_exclude = response_model_exclude
|
| self.response_model_by_alias = response_model_by_alias
|
| self.response_model_exclude_unset = response_model_exclude_unset
|
| self.response_model_exclude_defaults = response_model_exclude_defaults
|
| self.response_model_exclude_none = response_model_exclude_none
|
| self.include_in_schema = include_in_schema
|
| self.response_class = response_class
|
| self.dependency_overrides_provider = dependency_overrides_provider
|
| self.callbacks = callbacks
|
| self.openapi_extra = openapi_extra
|
| self.generate_unique_id_function = generate_unique_id_function
|
| self.tags = tags or []
|
| self.responses = responses or {}
|
| self.name = get_name(endpoint) if name is None else name
|
| self.path_regex, self.path_format, self.param_convertors = compile_path(path)
|
| if methods is None:
|
| methods = ["GET"]
|
| self.methods: set[str] = {method.upper() for method in methods}
|
| if isinstance(generate_unique_id_function, DefaultPlaceholder):
|
| current_generate_unique_id: Callable[[APIRoute], str] = (
|
| generate_unique_id_function.value
|
| )
|
| else:
|
| current_generate_unique_id = generate_unique_id_function
|
| self.unique_id = self.operation_id or current_generate_unique_id(self)
|
|
|
| if isinstance(status_code, IntEnum):
|
| status_code = int(status_code)
|
| self.status_code = status_code
|
| if self.response_model:
|
| assert is_body_allowed_for_status_code(status_code), (
|
| f"Status code {status_code} must not have a response body"
|
| )
|
| response_name = "Response_" + self.unique_id
|
| self.response_field = create_model_field(
|
| name=response_name,
|
| type_=self.response_model,
|
| mode="serialization",
|
| )
|
| else:
|
| self.response_field = None
|
| self.dependencies = list(dependencies or [])
|
| self.description = description or inspect.cleandoc(self.endpoint.__doc__ or "")
|
|
|
|
|
| self.description = self.description.split("\f")[0].strip()
|
| response_fields = {}
|
| for additional_status_code, response in self.responses.items():
|
| assert isinstance(response, dict), "An additional response must be a dict"
|
| model = response.get("model")
|
| if model:
|
| assert is_body_allowed_for_status_code(additional_status_code), (
|
| f"Status code {additional_status_code} must not have a response body"
|
| )
|
| response_name = f"Response_{additional_status_code}_{self.unique_id}"
|
| response_field = create_model_field(
|
| name=response_name, type_=model, mode="serialization"
|
| )
|
| response_fields[additional_status_code] = response_field
|
| if response_fields:
|
| self.response_fields: dict[Union[int, str], ModelField] = response_fields
|
| else:
|
| self.response_fields = {}
|
|
|
| assert callable(endpoint), "An endpoint must be a callable"
|
| self.dependant = get_dependant(
|
| path=self.path_format, call=self.endpoint, scope="function"
|
| )
|
| for depends in self.dependencies[::-1]:
|
| self.dependant.dependencies.insert(
|
| 0,
|
| get_parameterless_sub_dependant(depends=depends, path=self.path_format),
|
| )
|
| self._flat_dependant = get_flat_dependant(self.dependant)
|
| self._embed_body_fields = _should_embed_body_fields(
|
| self._flat_dependant.body_params
|
| )
|
| self.body_field = get_body_field(
|
| flat_dependant=self._flat_dependant,
|
| name=self.unique_id,
|
| embed_body_fields=self._embed_body_fields,
|
| )
|
| self.app = request_response(self.get_route_handler())
|
|
|
| def get_route_handler(self) -> Callable[[Request], Coroutine[Any, Any, Response]]:
|
| return get_request_handler(
|
| dependant=self.dependant,
|
| body_field=self.body_field,
|
| status_code=self.status_code,
|
| response_class=self.response_class,
|
| response_field=self.response_field,
|
| response_model_include=self.response_model_include,
|
| response_model_exclude=self.response_model_exclude,
|
| response_model_by_alias=self.response_model_by_alias,
|
| response_model_exclude_unset=self.response_model_exclude_unset,
|
| response_model_exclude_defaults=self.response_model_exclude_defaults,
|
| response_model_exclude_none=self.response_model_exclude_none,
|
| dependency_overrides_provider=self.dependency_overrides_provider,
|
| embed_body_fields=self._embed_body_fields,
|
| )
|
|
|
| def matches(self, scope: Scope) -> tuple[Match, Scope]:
|
| match, child_scope = super().matches(scope)
|
| if match != Match.NONE:
|
| child_scope["route"] = self
|
| return match, child_scope
|
|
|
|
|
| class APIRouter(routing.Router):
|
| """
|
| `APIRouter` class, used to group *path operations*, for example to structure
|
| an app in multiple files. It would then be included in the `FastAPI` app, or
|
| in another `APIRouter` (ultimately included in the app).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Bigger Applications - Multiple Files](https://fastapi.tiangolo.com/tutorial/bigger-applications/).
|
|
|
| ## Example
|
|
|
| ```python
|
| from fastapi import APIRouter, FastAPI
|
|
|
| app = FastAPI()
|
| router = APIRouter()
|
|
|
|
|
| @router.get("/users/", tags=["users"])
|
| async def read_users():
|
| return [{"username": "Rick"}, {"username": "Morty"}]
|
|
|
|
|
| app.include_router(router)
|
| ```
|
| """
|
|
|
| def __init__(
|
| self,
|
| *,
|
| prefix: Annotated[str, Doc("An optional path prefix for the router.")] = "",
|
| tags: Annotated[
|
| Optional[list[Union[str, Enum]]],
|
| Doc(
|
| """
|
| A list of tags to be applied to all the *path operations* in this
|
| router.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
|
| """
|
| ),
|
| ] = None,
|
| dependencies: Annotated[
|
| Optional[Sequence[params.Depends]],
|
| Doc(
|
| """
|
| A list of dependencies (using `Depends()`) to be applied to all the
|
| *path operations* in this router.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Bigger Applications - Multiple Files](https://fastapi.tiangolo.com/tutorial/bigger-applications/#include-an-apirouter-with-a-custom-prefix-tags-responses-and-dependencies).
|
| """
|
| ),
|
| ] = None,
|
| default_response_class: Annotated[
|
| type[Response],
|
| Doc(
|
| """
|
| The default response class to be used.
|
|
|
| Read more in the
|
| [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#default-response-class).
|
| """
|
| ),
|
| ] = Default(JSONResponse),
|
| responses: Annotated[
|
| Optional[dict[Union[int, str], dict[str, Any]]],
|
| Doc(
|
| """
|
| Additional responses to be shown in OpenAPI.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Additional Responses in OpenAPI](https://fastapi.tiangolo.com/advanced/additional-responses/).
|
|
|
| And in the
|
| [FastAPI docs for Bigger Applications](https://fastapi.tiangolo.com/tutorial/bigger-applications/#include-an-apirouter-with-a-custom-prefix-tags-responses-and-dependencies).
|
| """
|
| ),
|
| ] = None,
|
| callbacks: Annotated[
|
| Optional[list[BaseRoute]],
|
| Doc(
|
| """
|
| OpenAPI callbacks that should apply to all *path operations* in this
|
| router.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/).
|
| """
|
| ),
|
| ] = None,
|
| routes: Annotated[
|
| Optional[list[BaseRoute]],
|
| Doc(
|
| """
|
| **Note**: you probably shouldn't use this parameter, it is inherited
|
| from Starlette and supported for compatibility.
|
|
|
| ---
|
|
|
| A list of routes to serve incoming HTTP and WebSocket requests.
|
| """
|
| ),
|
| deprecated(
|
| """
|
| You normally wouldn't use this parameter with FastAPI, it is inherited
|
| from Starlette and supported for compatibility.
|
|
|
| In FastAPI, you normally would use the *path operation methods*,
|
| like `router.get()`, `router.post()`, etc.
|
| """
|
| ),
|
| ] = None,
|
| redirect_slashes: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Whether to detect and redirect slashes in URLs when the client doesn't
|
| use the same format.
|
| """
|
| ),
|
| ] = True,
|
| default: Annotated[
|
| Optional[ASGIApp],
|
| Doc(
|
| """
|
| Default function handler for this router. Used to handle
|
| 404 Not Found errors.
|
| """
|
| ),
|
| ] = None,
|
| dependency_overrides_provider: Annotated[
|
| Optional[Any],
|
| Doc(
|
| """
|
| Only used internally by FastAPI to handle dependency overrides.
|
|
|
| You shouldn't need to use it. It normally points to the `FastAPI` app
|
| object.
|
| """
|
| ),
|
| ] = None,
|
| route_class: Annotated[
|
| type[APIRoute],
|
| Doc(
|
| """
|
| Custom route (*path operation*) class to be used by this router.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Custom Request and APIRoute class](https://fastapi.tiangolo.com/how-to/custom-request-and-route/#custom-apiroute-class-in-a-router).
|
| """
|
| ),
|
| ] = APIRoute,
|
| on_startup: Annotated[
|
| Optional[Sequence[Callable[[], Any]]],
|
| Doc(
|
| """
|
| A list of startup event handler functions.
|
|
|
| You should instead use the `lifespan` handlers.
|
|
|
| Read more in the [FastAPI docs for `lifespan`](https://fastapi.tiangolo.com/advanced/events/).
|
| """
|
| ),
|
| ] = None,
|
| on_shutdown: Annotated[
|
| Optional[Sequence[Callable[[], Any]]],
|
| Doc(
|
| """
|
| A list of shutdown event handler functions.
|
|
|
| You should instead use the `lifespan` handlers.
|
|
|
| Read more in the
|
| [FastAPI docs for `lifespan`](https://fastapi.tiangolo.com/advanced/events/).
|
| """
|
| ),
|
| ] = None,
|
|
|
|
|
| lifespan: Annotated[
|
| Optional[Lifespan[Any]],
|
| Doc(
|
| """
|
| A `Lifespan` context manager handler. This replaces `startup` and
|
| `shutdown` functions with a single context manager.
|
|
|
| Read more in the
|
| [FastAPI docs for `lifespan`](https://fastapi.tiangolo.com/advanced/events/).
|
| """
|
| ),
|
| ] = None,
|
| deprecated: Annotated[
|
| Optional[bool],
|
| Doc(
|
| """
|
| Mark all *path operations* in this router as deprecated.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
|
| """
|
| ),
|
| ] = None,
|
| include_in_schema: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| To include (or not) all the *path operations* in this router in the
|
| generated OpenAPI.
|
|
|
| This affects the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
|
| """
|
| ),
|
| ] = True,
|
| generate_unique_id_function: Annotated[
|
| Callable[[APIRoute], str],
|
| Doc(
|
| """
|
| Customize the function used to generate unique IDs for the *path
|
| operations* shown in the generated OpenAPI.
|
|
|
| This is particularly useful when automatically generating clients or
|
| SDKs for your API.
|
|
|
| Read more about it in the
|
| [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
|
| """
|
| ),
|
| ] = Default(generate_unique_id),
|
| ) -> None:
|
|
|
|
|
|
|
| self.on_startup: list[Callable[[], Any]] = (
|
| [] if on_startup is None else list(on_startup)
|
| )
|
| self.on_shutdown: list[Callable[[], Any]] = (
|
| [] if on_shutdown is None else list(on_shutdown)
|
| )
|
|
|
|
|
| if lifespan is None:
|
|
|
| lifespan_context: Lifespan[Any] = _DefaultLifespan(self)
|
| elif inspect.isasyncgenfunction(lifespan):
|
| lifespan_context = asynccontextmanager(lifespan)
|
| elif inspect.isgeneratorfunction(lifespan):
|
| lifespan_context = _wrap_gen_lifespan_context(lifespan)
|
| else:
|
| lifespan_context = lifespan
|
| self.lifespan_context = lifespan_context
|
|
|
| super().__init__(
|
| routes=routes,
|
| redirect_slashes=redirect_slashes,
|
| default=default,
|
| lifespan=lifespan_context,
|
| )
|
| if prefix:
|
| assert prefix.startswith("/"), "A path prefix must start with '/'"
|
| assert not prefix.endswith("/"), (
|
| "A path prefix must not end with '/', as the routes will start with '/'"
|
| )
|
| self.prefix = prefix
|
| self.tags: list[Union[str, Enum]] = tags or []
|
| self.dependencies = list(dependencies or [])
|
| self.deprecated = deprecated
|
| self.include_in_schema = include_in_schema
|
| self.responses = responses or {}
|
| self.callbacks = callbacks or []
|
| self.dependency_overrides_provider = dependency_overrides_provider
|
| self.route_class = route_class
|
| self.default_response_class = default_response_class
|
| self.generate_unique_id_function = generate_unique_id_function
|
|
|
| def route(
|
| self,
|
| path: str,
|
| methods: Optional[Collection[str]] = None,
|
| name: Optional[str] = None,
|
| include_in_schema: bool = True,
|
| ) -> Callable[[DecoratedCallable], DecoratedCallable]:
|
| def decorator(func: DecoratedCallable) -> DecoratedCallable:
|
| self.add_route(
|
| path,
|
| func,
|
| methods=methods,
|
| name=name,
|
| include_in_schema=include_in_schema,
|
| )
|
| return func
|
|
|
| return decorator
|
|
|
| def add_api_route(
|
| self,
|
| path: str,
|
| endpoint: Callable[..., Any],
|
| *,
|
| response_model: Any = Default(None),
|
| status_code: Optional[int] = None,
|
| tags: Optional[list[Union[str, Enum]]] = None,
|
| dependencies: Optional[Sequence[params.Depends]] = None,
|
| summary: Optional[str] = None,
|
| description: Optional[str] = None,
|
| response_description: str = "Successful Response",
|
| responses: Optional[dict[Union[int, str], dict[str, Any]]] = None,
|
| deprecated: Optional[bool] = None,
|
| methods: Optional[Union[set[str], list[str]]] = None,
|
| operation_id: Optional[str] = None,
|
| response_model_include: Optional[IncEx] = None,
|
| response_model_exclude: Optional[IncEx] = None,
|
| response_model_by_alias: bool = True,
|
| response_model_exclude_unset: bool = False,
|
| response_model_exclude_defaults: bool = False,
|
| response_model_exclude_none: bool = False,
|
| include_in_schema: bool = True,
|
| response_class: Union[type[Response], DefaultPlaceholder] = Default(
|
| JSONResponse
|
| ),
|
| name: Optional[str] = None,
|
| route_class_override: Optional[type[APIRoute]] = None,
|
| callbacks: Optional[list[BaseRoute]] = None,
|
| openapi_extra: Optional[dict[str, Any]] = None,
|
| generate_unique_id_function: Union[
|
| Callable[[APIRoute], str], DefaultPlaceholder
|
| ] = Default(generate_unique_id),
|
| ) -> None:
|
| route_class = route_class_override or self.route_class
|
| responses = responses or {}
|
| combined_responses = {**self.responses, **responses}
|
| current_response_class = get_value_or_default(
|
| response_class, self.default_response_class
|
| )
|
| current_tags = self.tags.copy()
|
| if tags:
|
| current_tags.extend(tags)
|
| current_dependencies = self.dependencies.copy()
|
| if dependencies:
|
| current_dependencies.extend(dependencies)
|
| current_callbacks = self.callbacks.copy()
|
| if callbacks:
|
| current_callbacks.extend(callbacks)
|
| current_generate_unique_id = get_value_or_default(
|
| generate_unique_id_function, self.generate_unique_id_function
|
| )
|
| route = route_class(
|
| self.prefix + path,
|
| endpoint=endpoint,
|
| response_model=response_model,
|
| status_code=status_code,
|
| tags=current_tags,
|
| dependencies=current_dependencies,
|
| summary=summary,
|
| description=description,
|
| response_description=response_description,
|
| responses=combined_responses,
|
| deprecated=deprecated or self.deprecated,
|
| methods=methods,
|
| operation_id=operation_id,
|
| response_model_include=response_model_include,
|
| response_model_exclude=response_model_exclude,
|
| response_model_by_alias=response_model_by_alias,
|
| response_model_exclude_unset=response_model_exclude_unset,
|
| response_model_exclude_defaults=response_model_exclude_defaults,
|
| response_model_exclude_none=response_model_exclude_none,
|
| include_in_schema=include_in_schema and self.include_in_schema,
|
| response_class=current_response_class,
|
| name=name,
|
| dependency_overrides_provider=self.dependency_overrides_provider,
|
| callbacks=current_callbacks,
|
| openapi_extra=openapi_extra,
|
| generate_unique_id_function=current_generate_unique_id,
|
| )
|
| self.routes.append(route)
|
|
|
| def api_route(
|
| self,
|
| path: str,
|
| *,
|
| response_model: Any = Default(None),
|
| status_code: Optional[int] = None,
|
| tags: Optional[list[Union[str, Enum]]] = None,
|
| dependencies: Optional[Sequence[params.Depends]] = None,
|
| summary: Optional[str] = None,
|
| description: Optional[str] = None,
|
| response_description: str = "Successful Response",
|
| responses: Optional[dict[Union[int, str], dict[str, Any]]] = None,
|
| deprecated: Optional[bool] = None,
|
| methods: Optional[list[str]] = None,
|
| operation_id: Optional[str] = None,
|
| response_model_include: Optional[IncEx] = None,
|
| response_model_exclude: Optional[IncEx] = None,
|
| response_model_by_alias: bool = True,
|
| response_model_exclude_unset: bool = False,
|
| response_model_exclude_defaults: bool = False,
|
| response_model_exclude_none: bool = False,
|
| include_in_schema: bool = True,
|
| response_class: type[Response] = Default(JSONResponse),
|
| name: Optional[str] = None,
|
| callbacks: Optional[list[BaseRoute]] = None,
|
| openapi_extra: Optional[dict[str, Any]] = None,
|
| generate_unique_id_function: Callable[[APIRoute], str] = Default(
|
| generate_unique_id
|
| ),
|
| ) -> Callable[[DecoratedCallable], DecoratedCallable]:
|
| def decorator(func: DecoratedCallable) -> DecoratedCallable:
|
| self.add_api_route(
|
| path,
|
| func,
|
| response_model=response_model,
|
| status_code=status_code,
|
| tags=tags,
|
| dependencies=dependencies,
|
| summary=summary,
|
| description=description,
|
| response_description=response_description,
|
| responses=responses,
|
| deprecated=deprecated,
|
| methods=methods,
|
| operation_id=operation_id,
|
| response_model_include=response_model_include,
|
| response_model_exclude=response_model_exclude,
|
| response_model_by_alias=response_model_by_alias,
|
| response_model_exclude_unset=response_model_exclude_unset,
|
| response_model_exclude_defaults=response_model_exclude_defaults,
|
| response_model_exclude_none=response_model_exclude_none,
|
| include_in_schema=include_in_schema,
|
| response_class=response_class,
|
| name=name,
|
| callbacks=callbacks,
|
| openapi_extra=openapi_extra,
|
| generate_unique_id_function=generate_unique_id_function,
|
| )
|
| return func
|
|
|
| return decorator
|
|
|
| def add_api_websocket_route(
|
| self,
|
| path: str,
|
| endpoint: Callable[..., Any],
|
| name: Optional[str] = None,
|
| *,
|
| dependencies: Optional[Sequence[params.Depends]] = None,
|
| ) -> None:
|
| current_dependencies = self.dependencies.copy()
|
| if dependencies:
|
| current_dependencies.extend(dependencies)
|
|
|
| route = APIWebSocketRoute(
|
| self.prefix + path,
|
| endpoint=endpoint,
|
| name=name,
|
| dependencies=current_dependencies,
|
| dependency_overrides_provider=self.dependency_overrides_provider,
|
| )
|
| self.routes.append(route)
|
|
|
| def websocket(
|
| self,
|
| path: Annotated[
|
| str,
|
| Doc(
|
| """
|
| WebSocket path.
|
| """
|
| ),
|
| ],
|
| name: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| A name for the WebSocket. Only used internally.
|
| """
|
| ),
|
| ] = None,
|
| *,
|
| dependencies: Annotated[
|
| Optional[Sequence[params.Depends]],
|
| Doc(
|
| """
|
| A list of dependencies (using `Depends()`) to be used for this
|
| WebSocket.
|
|
|
| Read more about it in the
|
| [FastAPI docs for WebSockets](https://fastapi.tiangolo.com/advanced/websockets/).
|
| """
|
| ),
|
| ] = None,
|
| ) -> Callable[[DecoratedCallable], DecoratedCallable]:
|
| """
|
| Decorate a WebSocket function.
|
|
|
| Read more about it in the
|
| [FastAPI docs for WebSockets](https://fastapi.tiangolo.com/advanced/websockets/).
|
|
|
| **Example**
|
|
|
| ## Example
|
|
|
| ```python
|
| from fastapi import APIRouter, FastAPI, WebSocket
|
|
|
| app = FastAPI()
|
| router = APIRouter()
|
|
|
| @router.websocket("/ws")
|
| async def websocket_endpoint(websocket: WebSocket):
|
| await websocket.accept()
|
| while True:
|
| data = await websocket.receive_text()
|
| await websocket.send_text(f"Message text was: {data}")
|
|
|
| app.include_router(router)
|
| ```
|
| """
|
|
|
| def decorator(func: DecoratedCallable) -> DecoratedCallable:
|
| self.add_api_websocket_route(
|
| path, func, name=name, dependencies=dependencies
|
| )
|
| return func
|
|
|
| return decorator
|
|
|
| def websocket_route(
|
| self, path: str, name: Union[str, None] = None
|
| ) -> Callable[[DecoratedCallable], DecoratedCallable]:
|
| def decorator(func: DecoratedCallable) -> DecoratedCallable:
|
| self.add_websocket_route(path, func, name=name)
|
| return func
|
|
|
| return decorator
|
|
|
| def include_router(
|
| self,
|
| router: Annotated["APIRouter", Doc("The `APIRouter` to include.")],
|
| *,
|
| prefix: Annotated[str, Doc("An optional path prefix for the router.")] = "",
|
| tags: Annotated[
|
| Optional[list[Union[str, Enum]]],
|
| Doc(
|
| """
|
| A list of tags to be applied to all the *path operations* in this
|
| router.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
|
| """
|
| ),
|
| ] = None,
|
| dependencies: Annotated[
|
| Optional[Sequence[params.Depends]],
|
| Doc(
|
| """
|
| A list of dependencies (using `Depends()`) to be applied to all the
|
| *path operations* in this router.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Bigger Applications - Multiple Files](https://fastapi.tiangolo.com/tutorial/bigger-applications/#include-an-apirouter-with-a-custom-prefix-tags-responses-and-dependencies).
|
| """
|
| ),
|
| ] = None,
|
| default_response_class: Annotated[
|
| type[Response],
|
| Doc(
|
| """
|
| The default response class to be used.
|
|
|
| Read more in the
|
| [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#default-response-class).
|
| """
|
| ),
|
| ] = Default(JSONResponse),
|
| responses: Annotated[
|
| Optional[dict[Union[int, str], dict[str, Any]]],
|
| Doc(
|
| """
|
| Additional responses to be shown in OpenAPI.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Additional Responses in OpenAPI](https://fastapi.tiangolo.com/advanced/additional-responses/).
|
|
|
| And in the
|
| [FastAPI docs for Bigger Applications](https://fastapi.tiangolo.com/tutorial/bigger-applications/#include-an-apirouter-with-a-custom-prefix-tags-responses-and-dependencies).
|
| """
|
| ),
|
| ] = None,
|
| callbacks: Annotated[
|
| Optional[list[BaseRoute]],
|
| Doc(
|
| """
|
| OpenAPI callbacks that should apply to all *path operations* in this
|
| router.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/).
|
| """
|
| ),
|
| ] = None,
|
| deprecated: Annotated[
|
| Optional[bool],
|
| Doc(
|
| """
|
| Mark all *path operations* in this router as deprecated.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
|
| """
|
| ),
|
| ] = None,
|
| include_in_schema: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Include (or not) all the *path operations* in this router in the
|
| generated OpenAPI schema.
|
|
|
| This affects the generated OpenAPI (e.g. visible at `/docs`).
|
| """
|
| ),
|
| ] = True,
|
| generate_unique_id_function: Annotated[
|
| Callable[[APIRoute], str],
|
| Doc(
|
| """
|
| Customize the function used to generate unique IDs for the *path
|
| operations* shown in the generated OpenAPI.
|
|
|
| This is particularly useful when automatically generating clients or
|
| SDKs for your API.
|
|
|
| Read more about it in the
|
| [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
|
| """
|
| ),
|
| ] = Default(generate_unique_id),
|
| ) -> None:
|
| """
|
| Include another `APIRouter` in the same current `APIRouter`.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Bigger Applications](https://fastapi.tiangolo.com/tutorial/bigger-applications/).
|
|
|
| ## Example
|
|
|
| ```python
|
| from fastapi import APIRouter, FastAPI
|
|
|
| app = FastAPI()
|
| internal_router = APIRouter()
|
| users_router = APIRouter()
|
|
|
| @users_router.get("/users/")
|
| def read_users():
|
| return [{"name": "Rick"}, {"name": "Morty"}]
|
|
|
| internal_router.include_router(users_router)
|
| app.include_router(internal_router)
|
| ```
|
| """
|
| if prefix:
|
| assert prefix.startswith("/"), "A path prefix must start with '/'"
|
| assert not prefix.endswith("/"), (
|
| "A path prefix must not end with '/', as the routes will start with '/'"
|
| )
|
| else:
|
| for r in router.routes:
|
| path = getattr(r, "path")
|
| name = getattr(r, "name", "unknown")
|
| if path is not None and not path:
|
| raise FastAPIError(
|
| f"Prefix and path cannot be both empty (path operation: {name})"
|
| )
|
| if responses is None:
|
| responses = {}
|
| for route in router.routes:
|
| if isinstance(route, APIRoute):
|
| combined_responses = {**responses, **route.responses}
|
| use_response_class = get_value_or_default(
|
| route.response_class,
|
| router.default_response_class,
|
| default_response_class,
|
| self.default_response_class,
|
| )
|
| current_tags = []
|
| if tags:
|
| current_tags.extend(tags)
|
| if route.tags:
|
| current_tags.extend(route.tags)
|
| current_dependencies: list[params.Depends] = []
|
| if dependencies:
|
| current_dependencies.extend(dependencies)
|
| if route.dependencies:
|
| current_dependencies.extend(route.dependencies)
|
| current_callbacks = []
|
| if callbacks:
|
| current_callbacks.extend(callbacks)
|
| if route.callbacks:
|
| current_callbacks.extend(route.callbacks)
|
| current_generate_unique_id = get_value_or_default(
|
| route.generate_unique_id_function,
|
| router.generate_unique_id_function,
|
| generate_unique_id_function,
|
| self.generate_unique_id_function,
|
| )
|
| self.add_api_route(
|
| prefix + route.path,
|
| route.endpoint,
|
| response_model=route.response_model,
|
| status_code=route.status_code,
|
| tags=current_tags,
|
| dependencies=current_dependencies,
|
| summary=route.summary,
|
| description=route.description,
|
| response_description=route.response_description,
|
| responses=combined_responses,
|
| deprecated=route.deprecated or deprecated or self.deprecated,
|
| methods=route.methods,
|
| operation_id=route.operation_id,
|
| response_model_include=route.response_model_include,
|
| response_model_exclude=route.response_model_exclude,
|
| response_model_by_alias=route.response_model_by_alias,
|
| response_model_exclude_unset=route.response_model_exclude_unset,
|
| response_model_exclude_defaults=route.response_model_exclude_defaults,
|
| response_model_exclude_none=route.response_model_exclude_none,
|
| include_in_schema=route.include_in_schema
|
| and self.include_in_schema
|
| and include_in_schema,
|
| response_class=use_response_class,
|
| name=route.name,
|
| route_class_override=type(route),
|
| callbacks=current_callbacks,
|
| openapi_extra=route.openapi_extra,
|
| generate_unique_id_function=current_generate_unique_id,
|
| )
|
| elif isinstance(route, routing.Route):
|
| methods = list(route.methods or [])
|
| self.add_route(
|
| prefix + route.path,
|
| route.endpoint,
|
| methods=methods,
|
| include_in_schema=route.include_in_schema,
|
| name=route.name,
|
| )
|
| elif isinstance(route, APIWebSocketRoute):
|
| current_dependencies = []
|
| if dependencies:
|
| current_dependencies.extend(dependencies)
|
| if route.dependencies:
|
| current_dependencies.extend(route.dependencies)
|
| self.add_api_websocket_route(
|
| prefix + route.path,
|
| route.endpoint,
|
| dependencies=current_dependencies,
|
| name=route.name,
|
| )
|
| elif isinstance(route, routing.WebSocketRoute):
|
| self.add_websocket_route(
|
| prefix + route.path, route.endpoint, name=route.name
|
| )
|
| for handler in router.on_startup:
|
| self.add_event_handler("startup", handler)
|
| for handler in router.on_shutdown:
|
| self.add_event_handler("shutdown", handler)
|
| self.lifespan_context = _merge_lifespan_context(
|
| self.lifespan_context,
|
| router.lifespan_context,
|
| )
|
|
|
| def get(
|
| self,
|
| path: Annotated[
|
| str,
|
| Doc(
|
| """
|
| The URL path to be used for this *path operation*.
|
|
|
| For example, in `http://example.com/items`, the path is `/items`.
|
| """
|
| ),
|
| ],
|
| *,
|
| response_model: Annotated[
|
| Any,
|
| Doc(
|
| """
|
| The type to use for the response.
|
|
|
| It could be any valid Pydantic *field* type. So, it doesn't have to
|
| be a Pydantic model, it could be other things, like a `list`, `dict`,
|
| etc.
|
|
|
| It will be used for:
|
|
|
| * Documentation: the generated OpenAPI (and the UI at `/docs`) will
|
| show it as the response (JSON Schema).
|
| * Serialization: you could return an arbitrary object and the
|
| `response_model` would be used to serialize that object into the
|
| corresponding JSON.
|
| * Filtering: the JSON sent to the client will only contain the data
|
| (fields) defined in the `response_model`. If you returned an object
|
| that contains an attribute `password` but the `response_model` does
|
| not include that field, the JSON sent to the client would not have
|
| that `password`.
|
| * Validation: whatever you return will be serialized with the
|
| `response_model`, converting any data as necessary to generate the
|
| corresponding JSON. But if the data in the object returned is not
|
| valid, that would mean a violation of the contract with the client,
|
| so it's an error from the API developer. So, FastAPI will raise an
|
| error and return a 500 error code (Internal Server Error).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/).
|
| """
|
| ),
|
| ] = Default(None),
|
| status_code: Annotated[
|
| Optional[int],
|
| Doc(
|
| """
|
| The default status code to be used for the response.
|
|
|
| You could override the status code by returning a response directly.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/).
|
| """
|
| ),
|
| ] = None,
|
| tags: Annotated[
|
| Optional[list[Union[str, Enum]]],
|
| Doc(
|
| """
|
| A list of tags to be applied to the *path operation*.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags).
|
| """
|
| ),
|
| ] = None,
|
| dependencies: Annotated[
|
| Optional[Sequence[params.Depends]],
|
| Doc(
|
| """
|
| A list of dependencies (using `Depends()`) to be applied to the
|
| *path operation*.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/).
|
| """
|
| ),
|
| ] = None,
|
| summary: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| A summary for the *path operation*.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
|
| """
|
| ),
|
| ] = None,
|
| description: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| A description for the *path operation*.
|
|
|
| If not provided, it will be extracted automatically from the docstring
|
| of the *path operation function*.
|
|
|
| It can contain Markdown.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
|
| """
|
| ),
|
| ] = None,
|
| response_description: Annotated[
|
| str,
|
| Doc(
|
| """
|
| The description for the default response.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
| """
|
| ),
|
| ] = "Successful Response",
|
| responses: Annotated[
|
| Optional[dict[Union[int, str], dict[str, Any]]],
|
| Doc(
|
| """
|
| Additional responses that could be returned by this *path operation*.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
| """
|
| ),
|
| ] = None,
|
| deprecated: Annotated[
|
| Optional[bool],
|
| Doc(
|
| """
|
| Mark this *path operation* as deprecated.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
| """
|
| ),
|
| ] = None,
|
| operation_id: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| Custom operation ID to be used by this *path operation*.
|
|
|
| By default, it is generated automatically.
|
|
|
| If you provide a custom operation ID, you need to make sure it is
|
| unique for the whole API.
|
|
|
| You can customize the
|
| operation ID generation with the parameter
|
| `generate_unique_id_function` in the `FastAPI` class.
|
|
|
| Read more about it in the
|
| [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
|
| """
|
| ),
|
| ] = None,
|
| response_model_include: Annotated[
|
| Optional[IncEx],
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to include only certain fields in the
|
| response data.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
|
| """
|
| ),
|
| ] = None,
|
| response_model_exclude: Annotated[
|
| Optional[IncEx],
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to exclude certain fields in the
|
| response data.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
|
| """
|
| ),
|
| ] = None,
|
| response_model_by_alias: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to define if the response model
|
| should be serialized by alias when an alias is used.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
|
| """
|
| ),
|
| ] = True,
|
| response_model_exclude_unset: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to define if the response data
|
| should have all the fields, including the ones that were not set and
|
| have their default values. This is different from
|
| `response_model_exclude_defaults` in that if the fields are set,
|
| they will be included in the response, even if the value is the same
|
| as the default.
|
|
|
| When `True`, default values are omitted from the response.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter).
|
| """
|
| ),
|
| ] = False,
|
| response_model_exclude_defaults: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to define if the response data
|
| should have all the fields, including the ones that have the same value
|
| as the default. This is different from `response_model_exclude_unset`
|
| in that if the fields are set but contain the same default values,
|
| they will be excluded from the response.
|
|
|
| When `True`, default values are omitted from the response.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter).
|
| """
|
| ),
|
| ] = False,
|
| response_model_exclude_none: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to define if the response data should
|
| exclude fields set to `None`.
|
|
|
| This is much simpler (less smart) than `response_model_exclude_unset`
|
| and `response_model_exclude_defaults`. You probably want to use one of
|
| those two instead of this one, as those allow returning `None` values
|
| when it makes sense.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none).
|
| """
|
| ),
|
| ] = False,
|
| include_in_schema: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Include this *path operation* in the generated OpenAPI schema.
|
|
|
| This affects the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
|
| """
|
| ),
|
| ] = True,
|
| response_class: Annotated[
|
| type[Response],
|
| Doc(
|
| """
|
| Response class to be used for this *path operation*.
|
|
|
| This will not be used if you return a response directly.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse).
|
| """
|
| ),
|
| ] = Default(JSONResponse),
|
| name: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| Name for this *path operation*. Only used internally.
|
| """
|
| ),
|
| ] = None,
|
| callbacks: Annotated[
|
| Optional[list[BaseRoute]],
|
| Doc(
|
| """
|
| List of *path operations* that will be used as OpenAPI callbacks.
|
|
|
| This is only for OpenAPI documentation, the callbacks won't be used
|
| directly.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/).
|
| """
|
| ),
|
| ] = None,
|
| openapi_extra: Annotated[
|
| Optional[dict[str, Any]],
|
| Doc(
|
| """
|
| Extra metadata to be included in the OpenAPI schema for this *path
|
| operation*.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema).
|
| """
|
| ),
|
| ] = None,
|
| generate_unique_id_function: Annotated[
|
| Callable[[APIRoute], str],
|
| Doc(
|
| """
|
| Customize the function used to generate unique IDs for the *path
|
| operations* shown in the generated OpenAPI.
|
|
|
| This is particularly useful when automatically generating clients or
|
| SDKs for your API.
|
|
|
| Read more about it in the
|
| [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
|
| """
|
| ),
|
| ] = Default(generate_unique_id),
|
| ) -> Callable[[DecoratedCallable], DecoratedCallable]:
|
| """
|
| Add a *path operation* using an HTTP GET operation.
|
|
|
| ## Example
|
|
|
| ```python
|
| from fastapi import APIRouter, FastAPI
|
|
|
| app = FastAPI()
|
| router = APIRouter()
|
|
|
| @router.get("/items/")
|
| def read_items():
|
| return [{"name": "Empanada"}, {"name": "Arepa"}]
|
|
|
| app.include_router(router)
|
| ```
|
| """
|
| return self.api_route(
|
| path=path,
|
| response_model=response_model,
|
| status_code=status_code,
|
| tags=tags,
|
| dependencies=dependencies,
|
| summary=summary,
|
| description=description,
|
| response_description=response_description,
|
| responses=responses,
|
| deprecated=deprecated,
|
| methods=["GET"],
|
| operation_id=operation_id,
|
| response_model_include=response_model_include,
|
| response_model_exclude=response_model_exclude,
|
| response_model_by_alias=response_model_by_alias,
|
| response_model_exclude_unset=response_model_exclude_unset,
|
| response_model_exclude_defaults=response_model_exclude_defaults,
|
| response_model_exclude_none=response_model_exclude_none,
|
| include_in_schema=include_in_schema,
|
| response_class=response_class,
|
| name=name,
|
| callbacks=callbacks,
|
| openapi_extra=openapi_extra,
|
| generate_unique_id_function=generate_unique_id_function,
|
| )
|
|
|
| def put(
|
| self,
|
| path: Annotated[
|
| str,
|
| Doc(
|
| """
|
| The URL path to be used for this *path operation*.
|
|
|
| For example, in `http://example.com/items`, the path is `/items`.
|
| """
|
| ),
|
| ],
|
| *,
|
| response_model: Annotated[
|
| Any,
|
| Doc(
|
| """
|
| The type to use for the response.
|
|
|
| It could be any valid Pydantic *field* type. So, it doesn't have to
|
| be a Pydantic model, it could be other things, like a `list`, `dict`,
|
| etc.
|
|
|
| It will be used for:
|
|
|
| * Documentation: the generated OpenAPI (and the UI at `/docs`) will
|
| show it as the response (JSON Schema).
|
| * Serialization: you could return an arbitrary object and the
|
| `response_model` would be used to serialize that object into the
|
| corresponding JSON.
|
| * Filtering: the JSON sent to the client will only contain the data
|
| (fields) defined in the `response_model`. If you returned an object
|
| that contains an attribute `password` but the `response_model` does
|
| not include that field, the JSON sent to the client would not have
|
| that `password`.
|
| * Validation: whatever you return will be serialized with the
|
| `response_model`, converting any data as necessary to generate the
|
| corresponding JSON. But if the data in the object returned is not
|
| valid, that would mean a violation of the contract with the client,
|
| so it's an error from the API developer. So, FastAPI will raise an
|
| error and return a 500 error code (Internal Server Error).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/).
|
| """
|
| ),
|
| ] = Default(None),
|
| status_code: Annotated[
|
| Optional[int],
|
| Doc(
|
| """
|
| The default status code to be used for the response.
|
|
|
| You could override the status code by returning a response directly.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/).
|
| """
|
| ),
|
| ] = None,
|
| tags: Annotated[
|
| Optional[list[Union[str, Enum]]],
|
| Doc(
|
| """
|
| A list of tags to be applied to the *path operation*.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags).
|
| """
|
| ),
|
| ] = None,
|
| dependencies: Annotated[
|
| Optional[Sequence[params.Depends]],
|
| Doc(
|
| """
|
| A list of dependencies (using `Depends()`) to be applied to the
|
| *path operation*.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/).
|
| """
|
| ),
|
| ] = None,
|
| summary: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| A summary for the *path operation*.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
|
| """
|
| ),
|
| ] = None,
|
| description: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| A description for the *path operation*.
|
|
|
| If not provided, it will be extracted automatically from the docstring
|
| of the *path operation function*.
|
|
|
| It can contain Markdown.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
|
| """
|
| ),
|
| ] = None,
|
| response_description: Annotated[
|
| str,
|
| Doc(
|
| """
|
| The description for the default response.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
| """
|
| ),
|
| ] = "Successful Response",
|
| responses: Annotated[
|
| Optional[dict[Union[int, str], dict[str, Any]]],
|
| Doc(
|
| """
|
| Additional responses that could be returned by this *path operation*.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
| """
|
| ),
|
| ] = None,
|
| deprecated: Annotated[
|
| Optional[bool],
|
| Doc(
|
| """
|
| Mark this *path operation* as deprecated.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
| """
|
| ),
|
| ] = None,
|
| operation_id: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| Custom operation ID to be used by this *path operation*.
|
|
|
| By default, it is generated automatically.
|
|
|
| If you provide a custom operation ID, you need to make sure it is
|
| unique for the whole API.
|
|
|
| You can customize the
|
| operation ID generation with the parameter
|
| `generate_unique_id_function` in the `FastAPI` class.
|
|
|
| Read more about it in the
|
| [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
|
| """
|
| ),
|
| ] = None,
|
| response_model_include: Annotated[
|
| Optional[IncEx],
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to include only certain fields in the
|
| response data.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
|
| """
|
| ),
|
| ] = None,
|
| response_model_exclude: Annotated[
|
| Optional[IncEx],
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to exclude certain fields in the
|
| response data.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
|
| """
|
| ),
|
| ] = None,
|
| response_model_by_alias: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to define if the response model
|
| should be serialized by alias when an alias is used.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
|
| """
|
| ),
|
| ] = True,
|
| response_model_exclude_unset: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to define if the response data
|
| should have all the fields, including the ones that were not set and
|
| have their default values. This is different from
|
| `response_model_exclude_defaults` in that if the fields are set,
|
| they will be included in the response, even if the value is the same
|
| as the default.
|
|
|
| When `True`, default values are omitted from the response.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter).
|
| """
|
| ),
|
| ] = False,
|
| response_model_exclude_defaults: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to define if the response data
|
| should have all the fields, including the ones that have the same value
|
| as the default. This is different from `response_model_exclude_unset`
|
| in that if the fields are set but contain the same default values,
|
| they will be excluded from the response.
|
|
|
| When `True`, default values are omitted from the response.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter).
|
| """
|
| ),
|
| ] = False,
|
| response_model_exclude_none: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to define if the response data should
|
| exclude fields set to `None`.
|
|
|
| This is much simpler (less smart) than `response_model_exclude_unset`
|
| and `response_model_exclude_defaults`. You probably want to use one of
|
| those two instead of this one, as those allow returning `None` values
|
| when it makes sense.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none).
|
| """
|
| ),
|
| ] = False,
|
| include_in_schema: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Include this *path operation* in the generated OpenAPI schema.
|
|
|
| This affects the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
|
| """
|
| ),
|
| ] = True,
|
| response_class: Annotated[
|
| type[Response],
|
| Doc(
|
| """
|
| Response class to be used for this *path operation*.
|
|
|
| This will not be used if you return a response directly.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse).
|
| """
|
| ),
|
| ] = Default(JSONResponse),
|
| name: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| Name for this *path operation*. Only used internally.
|
| """
|
| ),
|
| ] = None,
|
| callbacks: Annotated[
|
| Optional[list[BaseRoute]],
|
| Doc(
|
| """
|
| List of *path operations* that will be used as OpenAPI callbacks.
|
|
|
| This is only for OpenAPI documentation, the callbacks won't be used
|
| directly.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/).
|
| """
|
| ),
|
| ] = None,
|
| openapi_extra: Annotated[
|
| Optional[dict[str, Any]],
|
| Doc(
|
| """
|
| Extra metadata to be included in the OpenAPI schema for this *path
|
| operation*.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema).
|
| """
|
| ),
|
| ] = None,
|
| generate_unique_id_function: Annotated[
|
| Callable[[APIRoute], str],
|
| Doc(
|
| """
|
| Customize the function used to generate unique IDs for the *path
|
| operations* shown in the generated OpenAPI.
|
|
|
| This is particularly useful when automatically generating clients or
|
| SDKs for your API.
|
|
|
| Read more about it in the
|
| [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
|
| """
|
| ),
|
| ] = Default(generate_unique_id),
|
| ) -> Callable[[DecoratedCallable], DecoratedCallable]:
|
| """
|
| Add a *path operation* using an HTTP PUT operation.
|
|
|
| ## Example
|
|
|
| ```python
|
| from fastapi import APIRouter, FastAPI
|
| from pydantic import BaseModel
|
|
|
| class Item(BaseModel):
|
| name: str
|
| description: str | None = None
|
|
|
| app = FastAPI()
|
| router = APIRouter()
|
|
|
| @router.put("/items/{item_id}")
|
| def replace_item(item_id: str, item: Item):
|
| return {"message": "Item replaced", "id": item_id}
|
|
|
| app.include_router(router)
|
| ```
|
| """
|
| return self.api_route(
|
| path=path,
|
| response_model=response_model,
|
| status_code=status_code,
|
| tags=tags,
|
| dependencies=dependencies,
|
| summary=summary,
|
| description=description,
|
| response_description=response_description,
|
| responses=responses,
|
| deprecated=deprecated,
|
| methods=["PUT"],
|
| operation_id=operation_id,
|
| response_model_include=response_model_include,
|
| response_model_exclude=response_model_exclude,
|
| response_model_by_alias=response_model_by_alias,
|
| response_model_exclude_unset=response_model_exclude_unset,
|
| response_model_exclude_defaults=response_model_exclude_defaults,
|
| response_model_exclude_none=response_model_exclude_none,
|
| include_in_schema=include_in_schema,
|
| response_class=response_class,
|
| name=name,
|
| callbacks=callbacks,
|
| openapi_extra=openapi_extra,
|
| generate_unique_id_function=generate_unique_id_function,
|
| )
|
|
|
| def post(
|
| self,
|
| path: Annotated[
|
| str,
|
| Doc(
|
| """
|
| The URL path to be used for this *path operation*.
|
|
|
| For example, in `http://example.com/items`, the path is `/items`.
|
| """
|
| ),
|
| ],
|
| *,
|
| response_model: Annotated[
|
| Any,
|
| Doc(
|
| """
|
| The type to use for the response.
|
|
|
| It could be any valid Pydantic *field* type. So, it doesn't have to
|
| be a Pydantic model, it could be other things, like a `list`, `dict`,
|
| etc.
|
|
|
| It will be used for:
|
|
|
| * Documentation: the generated OpenAPI (and the UI at `/docs`) will
|
| show it as the response (JSON Schema).
|
| * Serialization: you could return an arbitrary object and the
|
| `response_model` would be used to serialize that object into the
|
| corresponding JSON.
|
| * Filtering: the JSON sent to the client will only contain the data
|
| (fields) defined in the `response_model`. If you returned an object
|
| that contains an attribute `password` but the `response_model` does
|
| not include that field, the JSON sent to the client would not have
|
| that `password`.
|
| * Validation: whatever you return will be serialized with the
|
| `response_model`, converting any data as necessary to generate the
|
| corresponding JSON. But if the data in the object returned is not
|
| valid, that would mean a violation of the contract with the client,
|
| so it's an error from the API developer. So, FastAPI will raise an
|
| error and return a 500 error code (Internal Server Error).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/).
|
| """
|
| ),
|
| ] = Default(None),
|
| status_code: Annotated[
|
| Optional[int],
|
| Doc(
|
| """
|
| The default status code to be used for the response.
|
|
|
| You could override the status code by returning a response directly.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/).
|
| """
|
| ),
|
| ] = None,
|
| tags: Annotated[
|
| Optional[list[Union[str, Enum]]],
|
| Doc(
|
| """
|
| A list of tags to be applied to the *path operation*.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags).
|
| """
|
| ),
|
| ] = None,
|
| dependencies: Annotated[
|
| Optional[Sequence[params.Depends]],
|
| Doc(
|
| """
|
| A list of dependencies (using `Depends()`) to be applied to the
|
| *path operation*.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/).
|
| """
|
| ),
|
| ] = None,
|
| summary: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| A summary for the *path operation*.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
|
| """
|
| ),
|
| ] = None,
|
| description: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| A description for the *path operation*.
|
|
|
| If not provided, it will be extracted automatically from the docstring
|
| of the *path operation function*.
|
|
|
| It can contain Markdown.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
|
| """
|
| ),
|
| ] = None,
|
| response_description: Annotated[
|
| str,
|
| Doc(
|
| """
|
| The description for the default response.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
| """
|
| ),
|
| ] = "Successful Response",
|
| responses: Annotated[
|
| Optional[dict[Union[int, str], dict[str, Any]]],
|
| Doc(
|
| """
|
| Additional responses that could be returned by this *path operation*.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
| """
|
| ),
|
| ] = None,
|
| deprecated: Annotated[
|
| Optional[bool],
|
| Doc(
|
| """
|
| Mark this *path operation* as deprecated.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
| """
|
| ),
|
| ] = None,
|
| operation_id: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| Custom operation ID to be used by this *path operation*.
|
|
|
| By default, it is generated automatically.
|
|
|
| If you provide a custom operation ID, you need to make sure it is
|
| unique for the whole API.
|
|
|
| You can customize the
|
| operation ID generation with the parameter
|
| `generate_unique_id_function` in the `FastAPI` class.
|
|
|
| Read more about it in the
|
| [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
|
| """
|
| ),
|
| ] = None,
|
| response_model_include: Annotated[
|
| Optional[IncEx],
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to include only certain fields in the
|
| response data.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
|
| """
|
| ),
|
| ] = None,
|
| response_model_exclude: Annotated[
|
| Optional[IncEx],
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to exclude certain fields in the
|
| response data.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
|
| """
|
| ),
|
| ] = None,
|
| response_model_by_alias: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to define if the response model
|
| should be serialized by alias when an alias is used.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
|
| """
|
| ),
|
| ] = True,
|
| response_model_exclude_unset: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to define if the response data
|
| should have all the fields, including the ones that were not set and
|
| have their default values. This is different from
|
| `response_model_exclude_defaults` in that if the fields are set,
|
| they will be included in the response, even if the value is the same
|
| as the default.
|
|
|
| When `True`, default values are omitted from the response.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter).
|
| """
|
| ),
|
| ] = False,
|
| response_model_exclude_defaults: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to define if the response data
|
| should have all the fields, including the ones that have the same value
|
| as the default. This is different from `response_model_exclude_unset`
|
| in that if the fields are set but contain the same default values,
|
| they will be excluded from the response.
|
|
|
| When `True`, default values are omitted from the response.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter).
|
| """
|
| ),
|
| ] = False,
|
| response_model_exclude_none: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to define if the response data should
|
| exclude fields set to `None`.
|
|
|
| This is much simpler (less smart) than `response_model_exclude_unset`
|
| and `response_model_exclude_defaults`. You probably want to use one of
|
| those two instead of this one, as those allow returning `None` values
|
| when it makes sense.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none).
|
| """
|
| ),
|
| ] = False,
|
| include_in_schema: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Include this *path operation* in the generated OpenAPI schema.
|
|
|
| This affects the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
|
| """
|
| ),
|
| ] = True,
|
| response_class: Annotated[
|
| type[Response],
|
| Doc(
|
| """
|
| Response class to be used for this *path operation*.
|
|
|
| This will not be used if you return a response directly.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse).
|
| """
|
| ),
|
| ] = Default(JSONResponse),
|
| name: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| Name for this *path operation*. Only used internally.
|
| """
|
| ),
|
| ] = None,
|
| callbacks: Annotated[
|
| Optional[list[BaseRoute]],
|
| Doc(
|
| """
|
| List of *path operations* that will be used as OpenAPI callbacks.
|
|
|
| This is only for OpenAPI documentation, the callbacks won't be used
|
| directly.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/).
|
| """
|
| ),
|
| ] = None,
|
| openapi_extra: Annotated[
|
| Optional[dict[str, Any]],
|
| Doc(
|
| """
|
| Extra metadata to be included in the OpenAPI schema for this *path
|
| operation*.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema).
|
| """
|
| ),
|
| ] = None,
|
| generate_unique_id_function: Annotated[
|
| Callable[[APIRoute], str],
|
| Doc(
|
| """
|
| Customize the function used to generate unique IDs for the *path
|
| operations* shown in the generated OpenAPI.
|
|
|
| This is particularly useful when automatically generating clients or
|
| SDKs for your API.
|
|
|
| Read more about it in the
|
| [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
|
| """
|
| ),
|
| ] = Default(generate_unique_id),
|
| ) -> Callable[[DecoratedCallable], DecoratedCallable]:
|
| """
|
| Add a *path operation* using an HTTP POST operation.
|
|
|
| ## Example
|
|
|
| ```python
|
| from fastapi import APIRouter, FastAPI
|
| from pydantic import BaseModel
|
|
|
| class Item(BaseModel):
|
| name: str
|
| description: str | None = None
|
|
|
| app = FastAPI()
|
| router = APIRouter()
|
|
|
| @router.post("/items/")
|
| def create_item(item: Item):
|
| return {"message": "Item created"}
|
|
|
| app.include_router(router)
|
| ```
|
| """
|
| return self.api_route(
|
| path=path,
|
| response_model=response_model,
|
| status_code=status_code,
|
| tags=tags,
|
| dependencies=dependencies,
|
| summary=summary,
|
| description=description,
|
| response_description=response_description,
|
| responses=responses,
|
| deprecated=deprecated,
|
| methods=["POST"],
|
| operation_id=operation_id,
|
| response_model_include=response_model_include,
|
| response_model_exclude=response_model_exclude,
|
| response_model_by_alias=response_model_by_alias,
|
| response_model_exclude_unset=response_model_exclude_unset,
|
| response_model_exclude_defaults=response_model_exclude_defaults,
|
| response_model_exclude_none=response_model_exclude_none,
|
| include_in_schema=include_in_schema,
|
| response_class=response_class,
|
| name=name,
|
| callbacks=callbacks,
|
| openapi_extra=openapi_extra,
|
| generate_unique_id_function=generate_unique_id_function,
|
| )
|
|
|
| def delete(
|
| self,
|
| path: Annotated[
|
| str,
|
| Doc(
|
| """
|
| The URL path to be used for this *path operation*.
|
|
|
| For example, in `http://example.com/items`, the path is `/items`.
|
| """
|
| ),
|
| ],
|
| *,
|
| response_model: Annotated[
|
| Any,
|
| Doc(
|
| """
|
| The type to use for the response.
|
|
|
| It could be any valid Pydantic *field* type. So, it doesn't have to
|
| be a Pydantic model, it could be other things, like a `list`, `dict`,
|
| etc.
|
|
|
| It will be used for:
|
|
|
| * Documentation: the generated OpenAPI (and the UI at `/docs`) will
|
| show it as the response (JSON Schema).
|
| * Serialization: you could return an arbitrary object and the
|
| `response_model` would be used to serialize that object into the
|
| corresponding JSON.
|
| * Filtering: the JSON sent to the client will only contain the data
|
| (fields) defined in the `response_model`. If you returned an object
|
| that contains an attribute `password` but the `response_model` does
|
| not include that field, the JSON sent to the client would not have
|
| that `password`.
|
| * Validation: whatever you return will be serialized with the
|
| `response_model`, converting any data as necessary to generate the
|
| corresponding JSON. But if the data in the object returned is not
|
| valid, that would mean a violation of the contract with the client,
|
| so it's an error from the API developer. So, FastAPI will raise an
|
| error and return a 500 error code (Internal Server Error).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/).
|
| """
|
| ),
|
| ] = Default(None),
|
| status_code: Annotated[
|
| Optional[int],
|
| Doc(
|
| """
|
| The default status code to be used for the response.
|
|
|
| You could override the status code by returning a response directly.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/).
|
| """
|
| ),
|
| ] = None,
|
| tags: Annotated[
|
| Optional[list[Union[str, Enum]]],
|
| Doc(
|
| """
|
| A list of tags to be applied to the *path operation*.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags).
|
| """
|
| ),
|
| ] = None,
|
| dependencies: Annotated[
|
| Optional[Sequence[params.Depends]],
|
| Doc(
|
| """
|
| A list of dependencies (using `Depends()`) to be applied to the
|
| *path operation*.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/).
|
| """
|
| ),
|
| ] = None,
|
| summary: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| A summary for the *path operation*.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
|
| """
|
| ),
|
| ] = None,
|
| description: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| A description for the *path operation*.
|
|
|
| If not provided, it will be extracted automatically from the docstring
|
| of the *path operation function*.
|
|
|
| It can contain Markdown.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
|
| """
|
| ),
|
| ] = None,
|
| response_description: Annotated[
|
| str,
|
| Doc(
|
| """
|
| The description for the default response.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
| """
|
| ),
|
| ] = "Successful Response",
|
| responses: Annotated[
|
| Optional[dict[Union[int, str], dict[str, Any]]],
|
| Doc(
|
| """
|
| Additional responses that could be returned by this *path operation*.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
| """
|
| ),
|
| ] = None,
|
| deprecated: Annotated[
|
| Optional[bool],
|
| Doc(
|
| """
|
| Mark this *path operation* as deprecated.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
| """
|
| ),
|
| ] = None,
|
| operation_id: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| Custom operation ID to be used by this *path operation*.
|
|
|
| By default, it is generated automatically.
|
|
|
| If you provide a custom operation ID, you need to make sure it is
|
| unique for the whole API.
|
|
|
| You can customize the
|
| operation ID generation with the parameter
|
| `generate_unique_id_function` in the `FastAPI` class.
|
|
|
| Read more about it in the
|
| [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
|
| """
|
| ),
|
| ] = None,
|
| response_model_include: Annotated[
|
| Optional[IncEx],
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to include only certain fields in the
|
| response data.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
|
| """
|
| ),
|
| ] = None,
|
| response_model_exclude: Annotated[
|
| Optional[IncEx],
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to exclude certain fields in the
|
| response data.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
|
| """
|
| ),
|
| ] = None,
|
| response_model_by_alias: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to define if the response model
|
| should be serialized by alias when an alias is used.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
|
| """
|
| ),
|
| ] = True,
|
| response_model_exclude_unset: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to define if the response data
|
| should have all the fields, including the ones that were not set and
|
| have their default values. This is different from
|
| `response_model_exclude_defaults` in that if the fields are set,
|
| they will be included in the response, even if the value is the same
|
| as the default.
|
|
|
| When `True`, default values are omitted from the response.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter).
|
| """
|
| ),
|
| ] = False,
|
| response_model_exclude_defaults: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to define if the response data
|
| should have all the fields, including the ones that have the same value
|
| as the default. This is different from `response_model_exclude_unset`
|
| in that if the fields are set but contain the same default values,
|
| they will be excluded from the response.
|
|
|
| When `True`, default values are omitted from the response.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter).
|
| """
|
| ),
|
| ] = False,
|
| response_model_exclude_none: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to define if the response data should
|
| exclude fields set to `None`.
|
|
|
| This is much simpler (less smart) than `response_model_exclude_unset`
|
| and `response_model_exclude_defaults`. You probably want to use one of
|
| those two instead of this one, as those allow returning `None` values
|
| when it makes sense.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none).
|
| """
|
| ),
|
| ] = False,
|
| include_in_schema: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Include this *path operation* in the generated OpenAPI schema.
|
|
|
| This affects the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
|
| """
|
| ),
|
| ] = True,
|
| response_class: Annotated[
|
| type[Response],
|
| Doc(
|
| """
|
| Response class to be used for this *path operation*.
|
|
|
| This will not be used if you return a response directly.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse).
|
| """
|
| ),
|
| ] = Default(JSONResponse),
|
| name: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| Name for this *path operation*. Only used internally.
|
| """
|
| ),
|
| ] = None,
|
| callbacks: Annotated[
|
| Optional[list[BaseRoute]],
|
| Doc(
|
| """
|
| List of *path operations* that will be used as OpenAPI callbacks.
|
|
|
| This is only for OpenAPI documentation, the callbacks won't be used
|
| directly.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/).
|
| """
|
| ),
|
| ] = None,
|
| openapi_extra: Annotated[
|
| Optional[dict[str, Any]],
|
| Doc(
|
| """
|
| Extra metadata to be included in the OpenAPI schema for this *path
|
| operation*.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema).
|
| """
|
| ),
|
| ] = None,
|
| generate_unique_id_function: Annotated[
|
| Callable[[APIRoute], str],
|
| Doc(
|
| """
|
| Customize the function used to generate unique IDs for the *path
|
| operations* shown in the generated OpenAPI.
|
|
|
| This is particularly useful when automatically generating clients or
|
| SDKs for your API.
|
|
|
| Read more about it in the
|
| [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
|
| """
|
| ),
|
| ] = Default(generate_unique_id),
|
| ) -> Callable[[DecoratedCallable], DecoratedCallable]:
|
| """
|
| Add a *path operation* using an HTTP DELETE operation.
|
|
|
| ## Example
|
|
|
| ```python
|
| from fastapi import APIRouter, FastAPI
|
|
|
| app = FastAPI()
|
| router = APIRouter()
|
|
|
| @router.delete("/items/{item_id}")
|
| def delete_item(item_id: str):
|
| return {"message": "Item deleted"}
|
|
|
| app.include_router(router)
|
| ```
|
| """
|
| return self.api_route(
|
| path=path,
|
| response_model=response_model,
|
| status_code=status_code,
|
| tags=tags,
|
| dependencies=dependencies,
|
| summary=summary,
|
| description=description,
|
| response_description=response_description,
|
| responses=responses,
|
| deprecated=deprecated,
|
| methods=["DELETE"],
|
| operation_id=operation_id,
|
| response_model_include=response_model_include,
|
| response_model_exclude=response_model_exclude,
|
| response_model_by_alias=response_model_by_alias,
|
| response_model_exclude_unset=response_model_exclude_unset,
|
| response_model_exclude_defaults=response_model_exclude_defaults,
|
| response_model_exclude_none=response_model_exclude_none,
|
| include_in_schema=include_in_schema,
|
| response_class=response_class,
|
| name=name,
|
| callbacks=callbacks,
|
| openapi_extra=openapi_extra,
|
| generate_unique_id_function=generate_unique_id_function,
|
| )
|
|
|
| def options(
|
| self,
|
| path: Annotated[
|
| str,
|
| Doc(
|
| """
|
| The URL path to be used for this *path operation*.
|
|
|
| For example, in `http://example.com/items`, the path is `/items`.
|
| """
|
| ),
|
| ],
|
| *,
|
| response_model: Annotated[
|
| Any,
|
| Doc(
|
| """
|
| The type to use for the response.
|
|
|
| It could be any valid Pydantic *field* type. So, it doesn't have to
|
| be a Pydantic model, it could be other things, like a `list`, `dict`,
|
| etc.
|
|
|
| It will be used for:
|
|
|
| * Documentation: the generated OpenAPI (and the UI at `/docs`) will
|
| show it as the response (JSON Schema).
|
| * Serialization: you could return an arbitrary object and the
|
| `response_model` would be used to serialize that object into the
|
| corresponding JSON.
|
| * Filtering: the JSON sent to the client will only contain the data
|
| (fields) defined in the `response_model`. If you returned an object
|
| that contains an attribute `password` but the `response_model` does
|
| not include that field, the JSON sent to the client would not have
|
| that `password`.
|
| * Validation: whatever you return will be serialized with the
|
| `response_model`, converting any data as necessary to generate the
|
| corresponding JSON. But if the data in the object returned is not
|
| valid, that would mean a violation of the contract with the client,
|
| so it's an error from the API developer. So, FastAPI will raise an
|
| error and return a 500 error code (Internal Server Error).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/).
|
| """
|
| ),
|
| ] = Default(None),
|
| status_code: Annotated[
|
| Optional[int],
|
| Doc(
|
| """
|
| The default status code to be used for the response.
|
|
|
| You could override the status code by returning a response directly.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/).
|
| """
|
| ),
|
| ] = None,
|
| tags: Annotated[
|
| Optional[list[Union[str, Enum]]],
|
| Doc(
|
| """
|
| A list of tags to be applied to the *path operation*.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags).
|
| """
|
| ),
|
| ] = None,
|
| dependencies: Annotated[
|
| Optional[Sequence[params.Depends]],
|
| Doc(
|
| """
|
| A list of dependencies (using `Depends()`) to be applied to the
|
| *path operation*.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/).
|
| """
|
| ),
|
| ] = None,
|
| summary: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| A summary for the *path operation*.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
|
| """
|
| ),
|
| ] = None,
|
| description: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| A description for the *path operation*.
|
|
|
| If not provided, it will be extracted automatically from the docstring
|
| of the *path operation function*.
|
|
|
| It can contain Markdown.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
|
| """
|
| ),
|
| ] = None,
|
| response_description: Annotated[
|
| str,
|
| Doc(
|
| """
|
| The description for the default response.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
| """
|
| ),
|
| ] = "Successful Response",
|
| responses: Annotated[
|
| Optional[dict[Union[int, str], dict[str, Any]]],
|
| Doc(
|
| """
|
| Additional responses that could be returned by this *path operation*.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
| """
|
| ),
|
| ] = None,
|
| deprecated: Annotated[
|
| Optional[bool],
|
| Doc(
|
| """
|
| Mark this *path operation* as deprecated.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
| """
|
| ),
|
| ] = None,
|
| operation_id: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| Custom operation ID to be used by this *path operation*.
|
|
|
| By default, it is generated automatically.
|
|
|
| If you provide a custom operation ID, you need to make sure it is
|
| unique for the whole API.
|
|
|
| You can customize the
|
| operation ID generation with the parameter
|
| `generate_unique_id_function` in the `FastAPI` class.
|
|
|
| Read more about it in the
|
| [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
|
| """
|
| ),
|
| ] = None,
|
| response_model_include: Annotated[
|
| Optional[IncEx],
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to include only certain fields in the
|
| response data.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
|
| """
|
| ),
|
| ] = None,
|
| response_model_exclude: Annotated[
|
| Optional[IncEx],
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to exclude certain fields in the
|
| response data.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
|
| """
|
| ),
|
| ] = None,
|
| response_model_by_alias: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to define if the response model
|
| should be serialized by alias when an alias is used.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
|
| """
|
| ),
|
| ] = True,
|
| response_model_exclude_unset: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to define if the response data
|
| should have all the fields, including the ones that were not set and
|
| have their default values. This is different from
|
| `response_model_exclude_defaults` in that if the fields are set,
|
| they will be included in the response, even if the value is the same
|
| as the default.
|
|
|
| When `True`, default values are omitted from the response.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter).
|
| """
|
| ),
|
| ] = False,
|
| response_model_exclude_defaults: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to define if the response data
|
| should have all the fields, including the ones that have the same value
|
| as the default. This is different from `response_model_exclude_unset`
|
| in that if the fields are set but contain the same default values,
|
| they will be excluded from the response.
|
|
|
| When `True`, default values are omitted from the response.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter).
|
| """
|
| ),
|
| ] = False,
|
| response_model_exclude_none: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to define if the response data should
|
| exclude fields set to `None`.
|
|
|
| This is much simpler (less smart) than `response_model_exclude_unset`
|
| and `response_model_exclude_defaults`. You probably want to use one of
|
| those two instead of this one, as those allow returning `None` values
|
| when it makes sense.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none).
|
| """
|
| ),
|
| ] = False,
|
| include_in_schema: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Include this *path operation* in the generated OpenAPI schema.
|
|
|
| This affects the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
|
| """
|
| ),
|
| ] = True,
|
| response_class: Annotated[
|
| type[Response],
|
| Doc(
|
| """
|
| Response class to be used for this *path operation*.
|
|
|
| This will not be used if you return a response directly.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse).
|
| """
|
| ),
|
| ] = Default(JSONResponse),
|
| name: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| Name for this *path operation*. Only used internally.
|
| """
|
| ),
|
| ] = None,
|
| callbacks: Annotated[
|
| Optional[list[BaseRoute]],
|
| Doc(
|
| """
|
| List of *path operations* that will be used as OpenAPI callbacks.
|
|
|
| This is only for OpenAPI documentation, the callbacks won't be used
|
| directly.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/).
|
| """
|
| ),
|
| ] = None,
|
| openapi_extra: Annotated[
|
| Optional[dict[str, Any]],
|
| Doc(
|
| """
|
| Extra metadata to be included in the OpenAPI schema for this *path
|
| operation*.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema).
|
| """
|
| ),
|
| ] = None,
|
| generate_unique_id_function: Annotated[
|
| Callable[[APIRoute], str],
|
| Doc(
|
| """
|
| Customize the function used to generate unique IDs for the *path
|
| operations* shown in the generated OpenAPI.
|
|
|
| This is particularly useful when automatically generating clients or
|
| SDKs for your API.
|
|
|
| Read more about it in the
|
| [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
|
| """
|
| ),
|
| ] = Default(generate_unique_id),
|
| ) -> Callable[[DecoratedCallable], DecoratedCallable]:
|
| """
|
| Add a *path operation* using an HTTP OPTIONS operation.
|
|
|
| ## Example
|
|
|
| ```python
|
| from fastapi import APIRouter, FastAPI
|
|
|
| app = FastAPI()
|
| router = APIRouter()
|
|
|
| @router.options("/items/")
|
| def get_item_options():
|
| return {"additions": ["Aji", "Guacamole"]}
|
|
|
| app.include_router(router)
|
| ```
|
| """
|
| return self.api_route(
|
| path=path,
|
| response_model=response_model,
|
| status_code=status_code,
|
| tags=tags,
|
| dependencies=dependencies,
|
| summary=summary,
|
| description=description,
|
| response_description=response_description,
|
| responses=responses,
|
| deprecated=deprecated,
|
| methods=["OPTIONS"],
|
| operation_id=operation_id,
|
| response_model_include=response_model_include,
|
| response_model_exclude=response_model_exclude,
|
| response_model_by_alias=response_model_by_alias,
|
| response_model_exclude_unset=response_model_exclude_unset,
|
| response_model_exclude_defaults=response_model_exclude_defaults,
|
| response_model_exclude_none=response_model_exclude_none,
|
| include_in_schema=include_in_schema,
|
| response_class=response_class,
|
| name=name,
|
| callbacks=callbacks,
|
| openapi_extra=openapi_extra,
|
| generate_unique_id_function=generate_unique_id_function,
|
| )
|
|
|
| def head(
|
| self,
|
| path: Annotated[
|
| str,
|
| Doc(
|
| """
|
| The URL path to be used for this *path operation*.
|
|
|
| For example, in `http://example.com/items`, the path is `/items`.
|
| """
|
| ),
|
| ],
|
| *,
|
| response_model: Annotated[
|
| Any,
|
| Doc(
|
| """
|
| The type to use for the response.
|
|
|
| It could be any valid Pydantic *field* type. So, it doesn't have to
|
| be a Pydantic model, it could be other things, like a `list`, `dict`,
|
| etc.
|
|
|
| It will be used for:
|
|
|
| * Documentation: the generated OpenAPI (and the UI at `/docs`) will
|
| show it as the response (JSON Schema).
|
| * Serialization: you could return an arbitrary object and the
|
| `response_model` would be used to serialize that object into the
|
| corresponding JSON.
|
| * Filtering: the JSON sent to the client will only contain the data
|
| (fields) defined in the `response_model`. If you returned an object
|
| that contains an attribute `password` but the `response_model` does
|
| not include that field, the JSON sent to the client would not have
|
| that `password`.
|
| * Validation: whatever you return will be serialized with the
|
| `response_model`, converting any data as necessary to generate the
|
| corresponding JSON. But if the data in the object returned is not
|
| valid, that would mean a violation of the contract with the client,
|
| so it's an error from the API developer. So, FastAPI will raise an
|
| error and return a 500 error code (Internal Server Error).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/).
|
| """
|
| ),
|
| ] = Default(None),
|
| status_code: Annotated[
|
| Optional[int],
|
| Doc(
|
| """
|
| The default status code to be used for the response.
|
|
|
| You could override the status code by returning a response directly.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/).
|
| """
|
| ),
|
| ] = None,
|
| tags: Annotated[
|
| Optional[list[Union[str, Enum]]],
|
| Doc(
|
| """
|
| A list of tags to be applied to the *path operation*.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags).
|
| """
|
| ),
|
| ] = None,
|
| dependencies: Annotated[
|
| Optional[Sequence[params.Depends]],
|
| Doc(
|
| """
|
| A list of dependencies (using `Depends()`) to be applied to the
|
| *path operation*.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/).
|
| """
|
| ),
|
| ] = None,
|
| summary: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| A summary for the *path operation*.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
|
| """
|
| ),
|
| ] = None,
|
| description: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| A description for the *path operation*.
|
|
|
| If not provided, it will be extracted automatically from the docstring
|
| of the *path operation function*.
|
|
|
| It can contain Markdown.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
|
| """
|
| ),
|
| ] = None,
|
| response_description: Annotated[
|
| str,
|
| Doc(
|
| """
|
| The description for the default response.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
| """
|
| ),
|
| ] = "Successful Response",
|
| responses: Annotated[
|
| Optional[dict[Union[int, str], dict[str, Any]]],
|
| Doc(
|
| """
|
| Additional responses that could be returned by this *path operation*.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
| """
|
| ),
|
| ] = None,
|
| deprecated: Annotated[
|
| Optional[bool],
|
| Doc(
|
| """
|
| Mark this *path operation* as deprecated.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
| """
|
| ),
|
| ] = None,
|
| operation_id: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| Custom operation ID to be used by this *path operation*.
|
|
|
| By default, it is generated automatically.
|
|
|
| If you provide a custom operation ID, you need to make sure it is
|
| unique for the whole API.
|
|
|
| You can customize the
|
| operation ID generation with the parameter
|
| `generate_unique_id_function` in the `FastAPI` class.
|
|
|
| Read more about it in the
|
| [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
|
| """
|
| ),
|
| ] = None,
|
| response_model_include: Annotated[
|
| Optional[IncEx],
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to include only certain fields in the
|
| response data.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
|
| """
|
| ),
|
| ] = None,
|
| response_model_exclude: Annotated[
|
| Optional[IncEx],
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to exclude certain fields in the
|
| response data.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
|
| """
|
| ),
|
| ] = None,
|
| response_model_by_alias: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to define if the response model
|
| should be serialized by alias when an alias is used.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
|
| """
|
| ),
|
| ] = True,
|
| response_model_exclude_unset: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to define if the response data
|
| should have all the fields, including the ones that were not set and
|
| have their default values. This is different from
|
| `response_model_exclude_defaults` in that if the fields are set,
|
| they will be included in the response, even if the value is the same
|
| as the default.
|
|
|
| When `True`, default values are omitted from the response.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter).
|
| """
|
| ),
|
| ] = False,
|
| response_model_exclude_defaults: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to define if the response data
|
| should have all the fields, including the ones that have the same value
|
| as the default. This is different from `response_model_exclude_unset`
|
| in that if the fields are set but contain the same default values,
|
| they will be excluded from the response.
|
|
|
| When `True`, default values are omitted from the response.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter).
|
| """
|
| ),
|
| ] = False,
|
| response_model_exclude_none: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to define if the response data should
|
| exclude fields set to `None`.
|
|
|
| This is much simpler (less smart) than `response_model_exclude_unset`
|
| and `response_model_exclude_defaults`. You probably want to use one of
|
| those two instead of this one, as those allow returning `None` values
|
| when it makes sense.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none).
|
| """
|
| ),
|
| ] = False,
|
| include_in_schema: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Include this *path operation* in the generated OpenAPI schema.
|
|
|
| This affects the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
|
| """
|
| ),
|
| ] = True,
|
| response_class: Annotated[
|
| type[Response],
|
| Doc(
|
| """
|
| Response class to be used for this *path operation*.
|
|
|
| This will not be used if you return a response directly.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse).
|
| """
|
| ),
|
| ] = Default(JSONResponse),
|
| name: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| Name for this *path operation*. Only used internally.
|
| """
|
| ),
|
| ] = None,
|
| callbacks: Annotated[
|
| Optional[list[BaseRoute]],
|
| Doc(
|
| """
|
| List of *path operations* that will be used as OpenAPI callbacks.
|
|
|
| This is only for OpenAPI documentation, the callbacks won't be used
|
| directly.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/).
|
| """
|
| ),
|
| ] = None,
|
| openapi_extra: Annotated[
|
| Optional[dict[str, Any]],
|
| Doc(
|
| """
|
| Extra metadata to be included in the OpenAPI schema for this *path
|
| operation*.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema).
|
| """
|
| ),
|
| ] = None,
|
| generate_unique_id_function: Annotated[
|
| Callable[[APIRoute], str],
|
| Doc(
|
| """
|
| Customize the function used to generate unique IDs for the *path
|
| operations* shown in the generated OpenAPI.
|
|
|
| This is particularly useful when automatically generating clients or
|
| SDKs for your API.
|
|
|
| Read more about it in the
|
| [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
|
| """
|
| ),
|
| ] = Default(generate_unique_id),
|
| ) -> Callable[[DecoratedCallable], DecoratedCallable]:
|
| """
|
| Add a *path operation* using an HTTP HEAD operation.
|
|
|
| ## Example
|
|
|
| ```python
|
| from fastapi import APIRouter, FastAPI
|
| from pydantic import BaseModel
|
|
|
| class Item(BaseModel):
|
| name: str
|
| description: str | None = None
|
|
|
| app = FastAPI()
|
| router = APIRouter()
|
|
|
| @router.head("/items/", status_code=204)
|
| def get_items_headers(response: Response):
|
| response.headers["X-Cat-Dog"] = "Alone in the world"
|
|
|
| app.include_router(router)
|
| ```
|
| """
|
| return self.api_route(
|
| path=path,
|
| response_model=response_model,
|
| status_code=status_code,
|
| tags=tags,
|
| dependencies=dependencies,
|
| summary=summary,
|
| description=description,
|
| response_description=response_description,
|
| responses=responses,
|
| deprecated=deprecated,
|
| methods=["HEAD"],
|
| operation_id=operation_id,
|
| response_model_include=response_model_include,
|
| response_model_exclude=response_model_exclude,
|
| response_model_by_alias=response_model_by_alias,
|
| response_model_exclude_unset=response_model_exclude_unset,
|
| response_model_exclude_defaults=response_model_exclude_defaults,
|
| response_model_exclude_none=response_model_exclude_none,
|
| include_in_schema=include_in_schema,
|
| response_class=response_class,
|
| name=name,
|
| callbacks=callbacks,
|
| openapi_extra=openapi_extra,
|
| generate_unique_id_function=generate_unique_id_function,
|
| )
|
|
|
| def patch(
|
| self,
|
| path: Annotated[
|
| str,
|
| Doc(
|
| """
|
| The URL path to be used for this *path operation*.
|
|
|
| For example, in `http://example.com/items`, the path is `/items`.
|
| """
|
| ),
|
| ],
|
| *,
|
| response_model: Annotated[
|
| Any,
|
| Doc(
|
| """
|
| The type to use for the response.
|
|
|
| It could be any valid Pydantic *field* type. So, it doesn't have to
|
| be a Pydantic model, it could be other things, like a `list`, `dict`,
|
| etc.
|
|
|
| It will be used for:
|
|
|
| * Documentation: the generated OpenAPI (and the UI at `/docs`) will
|
| show it as the response (JSON Schema).
|
| * Serialization: you could return an arbitrary object and the
|
| `response_model` would be used to serialize that object into the
|
| corresponding JSON.
|
| * Filtering: the JSON sent to the client will only contain the data
|
| (fields) defined in the `response_model`. If you returned an object
|
| that contains an attribute `password` but the `response_model` does
|
| not include that field, the JSON sent to the client would not have
|
| that `password`.
|
| * Validation: whatever you return will be serialized with the
|
| `response_model`, converting any data as necessary to generate the
|
| corresponding JSON. But if the data in the object returned is not
|
| valid, that would mean a violation of the contract with the client,
|
| so it's an error from the API developer. So, FastAPI will raise an
|
| error and return a 500 error code (Internal Server Error).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/).
|
| """
|
| ),
|
| ] = Default(None),
|
| status_code: Annotated[
|
| Optional[int],
|
| Doc(
|
| """
|
| The default status code to be used for the response.
|
|
|
| You could override the status code by returning a response directly.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/).
|
| """
|
| ),
|
| ] = None,
|
| tags: Annotated[
|
| Optional[list[Union[str, Enum]]],
|
| Doc(
|
| """
|
| A list of tags to be applied to the *path operation*.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags).
|
| """
|
| ),
|
| ] = None,
|
| dependencies: Annotated[
|
| Optional[Sequence[params.Depends]],
|
| Doc(
|
| """
|
| A list of dependencies (using `Depends()`) to be applied to the
|
| *path operation*.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/).
|
| """
|
| ),
|
| ] = None,
|
| summary: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| A summary for the *path operation*.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
|
| """
|
| ),
|
| ] = None,
|
| description: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| A description for the *path operation*.
|
|
|
| If not provided, it will be extracted automatically from the docstring
|
| of the *path operation function*.
|
|
|
| It can contain Markdown.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
|
| """
|
| ),
|
| ] = None,
|
| response_description: Annotated[
|
| str,
|
| Doc(
|
| """
|
| The description for the default response.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
| """
|
| ),
|
| ] = "Successful Response",
|
| responses: Annotated[
|
| Optional[dict[Union[int, str], dict[str, Any]]],
|
| Doc(
|
| """
|
| Additional responses that could be returned by this *path operation*.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
| """
|
| ),
|
| ] = None,
|
| deprecated: Annotated[
|
| Optional[bool],
|
| Doc(
|
| """
|
| Mark this *path operation* as deprecated.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
| """
|
| ),
|
| ] = None,
|
| operation_id: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| Custom operation ID to be used by this *path operation*.
|
|
|
| By default, it is generated automatically.
|
|
|
| If you provide a custom operation ID, you need to make sure it is
|
| unique for the whole API.
|
|
|
| You can customize the
|
| operation ID generation with the parameter
|
| `generate_unique_id_function` in the `FastAPI` class.
|
|
|
| Read more about it in the
|
| [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
|
| """
|
| ),
|
| ] = None,
|
| response_model_include: Annotated[
|
| Optional[IncEx],
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to include only certain fields in the
|
| response data.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
|
| """
|
| ),
|
| ] = None,
|
| response_model_exclude: Annotated[
|
| Optional[IncEx],
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to exclude certain fields in the
|
| response data.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
|
| """
|
| ),
|
| ] = None,
|
| response_model_by_alias: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to define if the response model
|
| should be serialized by alias when an alias is used.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
|
| """
|
| ),
|
| ] = True,
|
| response_model_exclude_unset: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to define if the response data
|
| should have all the fields, including the ones that were not set and
|
| have their default values. This is different from
|
| `response_model_exclude_defaults` in that if the fields are set,
|
| they will be included in the response, even if the value is the same
|
| as the default.
|
|
|
| When `True`, default values are omitted from the response.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter).
|
| """
|
| ),
|
| ] = False,
|
| response_model_exclude_defaults: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to define if the response data
|
| should have all the fields, including the ones that have the same value
|
| as the default. This is different from `response_model_exclude_unset`
|
| in that if the fields are set but contain the same default values,
|
| they will be excluded from the response.
|
|
|
| When `True`, default values are omitted from the response.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter).
|
| """
|
| ),
|
| ] = False,
|
| response_model_exclude_none: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to define if the response data should
|
| exclude fields set to `None`.
|
|
|
| This is much simpler (less smart) than `response_model_exclude_unset`
|
| and `response_model_exclude_defaults`. You probably want to use one of
|
| those two instead of this one, as those allow returning `None` values
|
| when it makes sense.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none).
|
| """
|
| ),
|
| ] = False,
|
| include_in_schema: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Include this *path operation* in the generated OpenAPI schema.
|
|
|
| This affects the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
|
| """
|
| ),
|
| ] = True,
|
| response_class: Annotated[
|
| type[Response],
|
| Doc(
|
| """
|
| Response class to be used for this *path operation*.
|
|
|
| This will not be used if you return a response directly.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse).
|
| """
|
| ),
|
| ] = Default(JSONResponse),
|
| name: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| Name for this *path operation*. Only used internally.
|
| """
|
| ),
|
| ] = None,
|
| callbacks: Annotated[
|
| Optional[list[BaseRoute]],
|
| Doc(
|
| """
|
| List of *path operations* that will be used as OpenAPI callbacks.
|
|
|
| This is only for OpenAPI documentation, the callbacks won't be used
|
| directly.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/).
|
| """
|
| ),
|
| ] = None,
|
| openapi_extra: Annotated[
|
| Optional[dict[str, Any]],
|
| Doc(
|
| """
|
| Extra metadata to be included in the OpenAPI schema for this *path
|
| operation*.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema).
|
| """
|
| ),
|
| ] = None,
|
| generate_unique_id_function: Annotated[
|
| Callable[[APIRoute], str],
|
| Doc(
|
| """
|
| Customize the function used to generate unique IDs for the *path
|
| operations* shown in the generated OpenAPI.
|
|
|
| This is particularly useful when automatically generating clients or
|
| SDKs for your API.
|
|
|
| Read more about it in the
|
| [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
|
| """
|
| ),
|
| ] = Default(generate_unique_id),
|
| ) -> Callable[[DecoratedCallable], DecoratedCallable]:
|
| """
|
| Add a *path operation* using an HTTP PATCH operation.
|
|
|
| ## Example
|
|
|
| ```python
|
| from fastapi import APIRouter, FastAPI
|
| from pydantic import BaseModel
|
|
|
| class Item(BaseModel):
|
| name: str
|
| description: str | None = None
|
|
|
| app = FastAPI()
|
| router = APIRouter()
|
|
|
| @router.patch("/items/")
|
| def update_item(item: Item):
|
| return {"message": "Item updated in place"}
|
|
|
| app.include_router(router)
|
| ```
|
| """
|
| return self.api_route(
|
| path=path,
|
| response_model=response_model,
|
| status_code=status_code,
|
| tags=tags,
|
| dependencies=dependencies,
|
| summary=summary,
|
| description=description,
|
| response_description=response_description,
|
| responses=responses,
|
| deprecated=deprecated,
|
| methods=["PATCH"],
|
| operation_id=operation_id,
|
| response_model_include=response_model_include,
|
| response_model_exclude=response_model_exclude,
|
| response_model_by_alias=response_model_by_alias,
|
| response_model_exclude_unset=response_model_exclude_unset,
|
| response_model_exclude_defaults=response_model_exclude_defaults,
|
| response_model_exclude_none=response_model_exclude_none,
|
| include_in_schema=include_in_schema,
|
| response_class=response_class,
|
| name=name,
|
| callbacks=callbacks,
|
| openapi_extra=openapi_extra,
|
| generate_unique_id_function=generate_unique_id_function,
|
| )
|
|
|
| def trace(
|
| self,
|
| path: Annotated[
|
| str,
|
| Doc(
|
| """
|
| The URL path to be used for this *path operation*.
|
|
|
| For example, in `http://example.com/items`, the path is `/items`.
|
| """
|
| ),
|
| ],
|
| *,
|
| response_model: Annotated[
|
| Any,
|
| Doc(
|
| """
|
| The type to use for the response.
|
|
|
| It could be any valid Pydantic *field* type. So, it doesn't have to
|
| be a Pydantic model, it could be other things, like a `list`, `dict`,
|
| etc.
|
|
|
| It will be used for:
|
|
|
| * Documentation: the generated OpenAPI (and the UI at `/docs`) will
|
| show it as the response (JSON Schema).
|
| * Serialization: you could return an arbitrary object and the
|
| `response_model` would be used to serialize that object into the
|
| corresponding JSON.
|
| * Filtering: the JSON sent to the client will only contain the data
|
| (fields) defined in the `response_model`. If you returned an object
|
| that contains an attribute `password` but the `response_model` does
|
| not include that field, the JSON sent to the client would not have
|
| that `password`.
|
| * Validation: whatever you return will be serialized with the
|
| `response_model`, converting any data as necessary to generate the
|
| corresponding JSON. But if the data in the object returned is not
|
| valid, that would mean a violation of the contract with the client,
|
| so it's an error from the API developer. So, FastAPI will raise an
|
| error and return a 500 error code (Internal Server Error).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/).
|
| """
|
| ),
|
| ] = Default(None),
|
| status_code: Annotated[
|
| Optional[int],
|
| Doc(
|
| """
|
| The default status code to be used for the response.
|
|
|
| You could override the status code by returning a response directly.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/).
|
| """
|
| ),
|
| ] = None,
|
| tags: Annotated[
|
| Optional[list[Union[str, Enum]]],
|
| Doc(
|
| """
|
| A list of tags to be applied to the *path operation*.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags).
|
| """
|
| ),
|
| ] = None,
|
| dependencies: Annotated[
|
| Optional[Sequence[params.Depends]],
|
| Doc(
|
| """
|
| A list of dependencies (using `Depends()`) to be applied to the
|
| *path operation*.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/).
|
| """
|
| ),
|
| ] = None,
|
| summary: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| A summary for the *path operation*.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
|
| """
|
| ),
|
| ] = None,
|
| description: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| A description for the *path operation*.
|
|
|
| If not provided, it will be extracted automatically from the docstring
|
| of the *path operation function*.
|
|
|
| It can contain Markdown.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
|
| """
|
| ),
|
| ] = None,
|
| response_description: Annotated[
|
| str,
|
| Doc(
|
| """
|
| The description for the default response.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
| """
|
| ),
|
| ] = "Successful Response",
|
| responses: Annotated[
|
| Optional[dict[Union[int, str], dict[str, Any]]],
|
| Doc(
|
| """
|
| Additional responses that could be returned by this *path operation*.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
| """
|
| ),
|
| ] = None,
|
| deprecated: Annotated[
|
| Optional[bool],
|
| Doc(
|
| """
|
| Mark this *path operation* as deprecated.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
| """
|
| ),
|
| ] = None,
|
| operation_id: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| Custom operation ID to be used by this *path operation*.
|
|
|
| By default, it is generated automatically.
|
|
|
| If you provide a custom operation ID, you need to make sure it is
|
| unique for the whole API.
|
|
|
| You can customize the
|
| operation ID generation with the parameter
|
| `generate_unique_id_function` in the `FastAPI` class.
|
|
|
| Read more about it in the
|
| [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
|
| """
|
| ),
|
| ] = None,
|
| response_model_include: Annotated[
|
| Optional[IncEx],
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to include only certain fields in the
|
| response data.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
|
| """
|
| ),
|
| ] = None,
|
| response_model_exclude: Annotated[
|
| Optional[IncEx],
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to exclude certain fields in the
|
| response data.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
|
| """
|
| ),
|
| ] = None,
|
| response_model_by_alias: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to define if the response model
|
| should be serialized by alias when an alias is used.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
|
| """
|
| ),
|
| ] = True,
|
| response_model_exclude_unset: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to define if the response data
|
| should have all the fields, including the ones that were not set and
|
| have their default values. This is different from
|
| `response_model_exclude_defaults` in that if the fields are set,
|
| they will be included in the response, even if the value is the same
|
| as the default.
|
|
|
| When `True`, default values are omitted from the response.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter).
|
| """
|
| ),
|
| ] = False,
|
| response_model_exclude_defaults: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to define if the response data
|
| should have all the fields, including the ones that have the same value
|
| as the default. This is different from `response_model_exclude_unset`
|
| in that if the fields are set but contain the same default values,
|
| they will be excluded from the response.
|
|
|
| When `True`, default values are omitted from the response.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter).
|
| """
|
| ),
|
| ] = False,
|
| response_model_exclude_none: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Configuration passed to Pydantic to define if the response data should
|
| exclude fields set to `None`.
|
|
|
| This is much simpler (less smart) than `response_model_exclude_unset`
|
| and `response_model_exclude_defaults`. You probably want to use one of
|
| those two instead of this one, as those allow returning `None` values
|
| when it makes sense.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none).
|
| """
|
| ),
|
| ] = False,
|
| include_in_schema: Annotated[
|
| bool,
|
| Doc(
|
| """
|
| Include this *path operation* in the generated OpenAPI schema.
|
|
|
| This affects the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
|
| """
|
| ),
|
| ] = True,
|
| response_class: Annotated[
|
| type[Response],
|
| Doc(
|
| """
|
| Response class to be used for this *path operation*.
|
|
|
| This will not be used if you return a response directly.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse).
|
| """
|
| ),
|
| ] = Default(JSONResponse),
|
| name: Annotated[
|
| Optional[str],
|
| Doc(
|
| """
|
| Name for this *path operation*. Only used internally.
|
| """
|
| ),
|
| ] = None,
|
| callbacks: Annotated[
|
| Optional[list[BaseRoute]],
|
| Doc(
|
| """
|
| List of *path operations* that will be used as OpenAPI callbacks.
|
|
|
| This is only for OpenAPI documentation, the callbacks won't be used
|
| directly.
|
|
|
| It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
|
| Read more about it in the
|
| [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/).
|
| """
|
| ),
|
| ] = None,
|
| openapi_extra: Annotated[
|
| Optional[dict[str, Any]],
|
| Doc(
|
| """
|
| Extra metadata to be included in the OpenAPI schema for this *path
|
| operation*.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema).
|
| """
|
| ),
|
| ] = None,
|
| generate_unique_id_function: Annotated[
|
| Callable[[APIRoute], str],
|
| Doc(
|
| """
|
| Customize the function used to generate unique IDs for the *path
|
| operations* shown in the generated OpenAPI.
|
|
|
| This is particularly useful when automatically generating clients or
|
| SDKs for your API.
|
|
|
| Read more about it in the
|
| [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
|
| """
|
| ),
|
| ] = Default(generate_unique_id),
|
| ) -> Callable[[DecoratedCallable], DecoratedCallable]:
|
| """
|
| Add a *path operation* using an HTTP TRACE operation.
|
|
|
| ## Example
|
|
|
| ```python
|
| from fastapi import APIRouter, FastAPI
|
| from pydantic import BaseModel
|
|
|
| class Item(BaseModel):
|
| name: str
|
| description: str | None = None
|
|
|
| app = FastAPI()
|
| router = APIRouter()
|
|
|
| @router.trace("/items/{item_id}")
|
| def trace_item(item_id: str):
|
| return None
|
|
|
| app.include_router(router)
|
| ```
|
| """
|
| return self.api_route(
|
| path=path,
|
| response_model=response_model,
|
| status_code=status_code,
|
| tags=tags,
|
| dependencies=dependencies,
|
| summary=summary,
|
| description=description,
|
| response_description=response_description,
|
| responses=responses,
|
| deprecated=deprecated,
|
| methods=["TRACE"],
|
| operation_id=operation_id,
|
| response_model_include=response_model_include,
|
| response_model_exclude=response_model_exclude,
|
| response_model_by_alias=response_model_by_alias,
|
| response_model_exclude_unset=response_model_exclude_unset,
|
| response_model_exclude_defaults=response_model_exclude_defaults,
|
| response_model_exclude_none=response_model_exclude_none,
|
| include_in_schema=include_in_schema,
|
| response_class=response_class,
|
| name=name,
|
| callbacks=callbacks,
|
| openapi_extra=openapi_extra,
|
| generate_unique_id_function=generate_unique_id_function,
|
| )
|
|
|
|
|
| async def _startup(self) -> None:
|
| """
|
| Run any `.on_startup` event handlers.
|
|
|
| This method is kept for backward compatibility after Starlette removed
|
| support for on_startup/on_shutdown handlers.
|
|
|
| Ref: https://github.com/Kludex/starlette/pull/3117
|
| """
|
| for handler in self.on_startup:
|
| if is_async_callable(handler):
|
| await handler()
|
| else:
|
| handler()
|
|
|
|
|
| async def _shutdown(self) -> None:
|
| """
|
| Run any `.on_shutdown` event handlers.
|
|
|
| This method is kept for backward compatibility after Starlette removed
|
| support for on_startup/on_shutdown handlers.
|
|
|
| Ref: https://github.com/Kludex/starlette/pull/3117
|
| """
|
| for handler in self.on_shutdown:
|
| if is_async_callable(handler):
|
| await handler()
|
| else:
|
| handler()
|
|
|
|
|
| def add_event_handler(
|
| self,
|
| event_type: str,
|
| func: Callable[[], Any],
|
| ) -> None:
|
| """
|
| Add an event handler function for startup or shutdown.
|
|
|
| This method is kept for backward compatibility after Starlette removed
|
| support for on_startup/on_shutdown handlers.
|
|
|
| Ref: https://github.com/Kludex/starlette/pull/3117
|
| """
|
| assert event_type in ("startup", "shutdown")
|
| if event_type == "startup":
|
| self.on_startup.append(func)
|
| else:
|
| self.on_shutdown.append(func)
|
|
|
| @deprecated(
|
| """
|
| on_event is deprecated, use lifespan event handlers instead.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/).
|
| """
|
| )
|
| def on_event(
|
| self,
|
| event_type: Annotated[
|
| str,
|
| Doc(
|
| """
|
| The type of event. `startup` or `shutdown`.
|
| """
|
| ),
|
| ],
|
| ) -> Callable[[DecoratedCallable], DecoratedCallable]:
|
| """
|
| Add an event handler for the router.
|
|
|
| `on_event` is deprecated, use `lifespan` event handlers instead.
|
|
|
| Read more about it in the
|
| [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/#alternative-events-deprecated).
|
| """
|
|
|
| def decorator(func: DecoratedCallable) -> DecoratedCallable:
|
| self.add_event_handler(event_type, func)
|
| return func
|
|
|
| return decorator
|
|
|