pythonasyncioapiasyncfastapiframeworkjsonjson-schemaopenapiopenapi3pydanticpython-typespython3redocreststarletteswaggerswagger-uiuvicornweb
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
4002 lines
153 KiB
4002 lines
153 KiB
import inspect
|
|
from collections.abc import (
|
|
Callable,
|
|
Collection,
|
|
Sequence,
|
|
)
|
|
from contextlib import (
|
|
asynccontextmanager,
|
|
)
|
|
from enum import Enum
|
|
from typing import (
|
|
Annotated,
|
|
Any,
|
|
)
|
|
|
|
from annotated_doc import Doc
|
|
from fastapi import params
|
|
from fastapi.datastructures import Default, DefaultPlaceholder
|
|
from fastapi.exceptions import (
|
|
FastAPIError,
|
|
)
|
|
from fastapi.routing_handlers import (
|
|
get_request_handler as get_request_handler,
|
|
)
|
|
from fastapi.routing_handlers import (
|
|
get_websocket_app as get_websocket_app,
|
|
)
|
|
from fastapi.routing_routes import APIRoute as APIRoute
|
|
from fastapi.routing_routes import APIWebSocketRoute as APIWebSocketRoute
|
|
from fastapi.routing_utils import (
|
|
_DefaultLifespan,
|
|
_merge_lifespan_context,
|
|
_wrap_gen_lifespan_context,
|
|
)
|
|
from fastapi.types import DecoratedCallable, IncEx
|
|
from fastapi.utils import (
|
|
generate_unique_id,
|
|
get_value_or_default,
|
|
)
|
|
from starlette import routing
|
|
from starlette._utils import is_async_callable
|
|
from starlette.responses import JSONResponse, Response
|
|
from starlette.routing import (
|
|
BaseRoute,
|
|
)
|
|
from starlette.routing import Mount as Mount # noqa
|
|
from starlette.types import ASGIApp, Lifespan
|
|
from typing_extensions import deprecated
|
|
|
|
|
|
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[
|
|
list[str | Enum] | None,
|
|
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[
|
|
Sequence[params.Depends] | None,
|
|
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[
|
|
dict[int | str, dict[str, Any]] | None,
|
|
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[
|
|
list[BaseRoute] | None,
|
|
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[
|
|
list[BaseRoute] | None,
|
|
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[
|
|
ASGIApp | None,
|
|
Doc(
|
|
"""
|
|
Default function handler for this router. Used to handle
|
|
404 Not Found errors.
|
|
"""
|
|
),
|
|
] = None,
|
|
dependency_overrides_provider: Annotated[
|
|
Any | None,
|
|
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[
|
|
Sequence[Callable[[], Any]] | None,
|
|
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[
|
|
Sequence[Callable[[], Any]] | None,
|
|
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,
|
|
# the generic to Lifespan[AppType] is the type of the top level application
|
|
# which the router cannot know statically, so we use typing.Any
|
|
lifespan: Annotated[
|
|
Lifespan[Any] | None,
|
|
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[
|
|
bool | None,
|
|
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),
|
|
strict_content_type: Annotated[
|
|
bool,
|
|
Doc(
|
|
"""
|
|
Enable strict checking for request Content-Type headers.
|
|
|
|
When `True` (the default), requests with a body that do not include
|
|
a `Content-Type` header will **not** be parsed as JSON.
|
|
|
|
This prevents potential cross-site request forgery (CSRF) attacks
|
|
that exploit the browser's ability to send requests without a
|
|
Content-Type header, bypassing CORS preflight checks. In particular
|
|
applicable for apps that need to be run locally (in localhost).
|
|
|
|
When `False`, requests without a `Content-Type` header will have
|
|
their body parsed as JSON, which maintains compatibility with
|
|
certain clients that don't send `Content-Type` headers.
|
|
|
|
Read more about it in the
|
|
[FastAPI docs for Strict Content-Type](https://fastapi.tiangolo.com/advanced/strict-content-type/).
|
|
"""
|
|
),
|
|
] = Default(True),
|
|
) -> None:
|
|
# Determine the lifespan context to use
|
|
if lifespan is None:
|
|
# Use the default lifespan that runs on_startup/on_shutdown handlers
|
|
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 '/'"
|
|
)
|
|
|
|
# Handle on_startup/on_shutdown locally since Starlette removed support
|
|
# Ref: https://github.com/Kludex/starlette/pull/3117
|
|
# TODO: deprecate this once the lifespan (or alternative) interface is improved
|
|
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)
|
|
)
|
|
|
|
self.prefix = prefix
|
|
self.tags: list[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
|
|
self.strict_content_type = strict_content_type
|
|
|
|
def route(
|
|
self,
|
|
path: str,
|
|
methods: Collection[str] | None = None,
|
|
name: str | None = 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: int | None = None,
|
|
tags: list[str | Enum] | None = None,
|
|
dependencies: Sequence[params.Depends] | None = None,
|
|
summary: str | None = None,
|
|
description: str | None = None,
|
|
response_description: str = "Successful Response",
|
|
responses: dict[int | str, dict[str, Any]] | None = None,
|
|
deprecated: bool | None = None,
|
|
methods: set[str] | list[str] | None = None,
|
|
operation_id: str | None = None,
|
|
response_model_include: IncEx | None = None,
|
|
response_model_exclude: IncEx | None = 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] | DefaultPlaceholder = Default(JSONResponse),
|
|
name: str | None = None,
|
|
route_class_override: type[APIRoute] | None = None,
|
|
callbacks: list[BaseRoute] | None = None,
|
|
openapi_extra: dict[str, Any] | None = None,
|
|
generate_unique_id_function: Callable[[APIRoute], str]
|
|
| DefaultPlaceholder = Default(generate_unique_id),
|
|
strict_content_type: bool | DefaultPlaceholder = Default(True),
|
|
) -> 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,
|
|
strict_content_type=get_value_or_default(
|
|
strict_content_type, self.strict_content_type
|
|
),
|
|
)
|
|
self.routes.append(route)
|
|
|
|
def api_route(
|
|
self,
|
|
path: str,
|
|
*,
|
|
response_model: Any = Default(None),
|
|
status_code: int | None = None,
|
|
tags: list[str | Enum] | None = None,
|
|
dependencies: Sequence[params.Depends] | None = None,
|
|
summary: str | None = None,
|
|
description: str | None = None,
|
|
response_description: str = "Successful Response",
|
|
responses: dict[int | str, dict[str, Any]] | None = None,
|
|
deprecated: bool | None = None,
|
|
methods: list[str] | None = None,
|
|
operation_id: str | None = None,
|
|
response_model_include: IncEx | None = None,
|
|
response_model_exclude: IncEx | None = 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: str | None = None,
|
|
callbacks: list[BaseRoute] | None = None,
|
|
openapi_extra: dict[str, Any] | None = 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: str | None = None,
|
|
*,
|
|
dependencies: Sequence[params.Depends] | None = 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[
|
|
str | None,
|
|
Doc(
|
|
"""
|
|
A name for the WebSocket. Only used internally.
|
|
"""
|
|
),
|
|
] = None,
|
|
*,
|
|
dependencies: Annotated[
|
|
Sequence[params.Depends] | None,
|
|
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: 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[
|
|
list[str | Enum] | None,
|
|
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[
|
|
Sequence[params.Depends] | None,
|
|
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[
|
|
dict[int | str, dict[str, Any]] | None,
|
|
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[
|
|
list[BaseRoute] | None,
|
|
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[
|
|
bool | None,
|
|
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)
|
|
```
|
|
"""
|
|
assert self is not router, (
|
|
"Cannot include the same APIRouter instance into itself. "
|
|
"Did you mean to include a different 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") # noqa: B009
|
|
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,
|
|
strict_content_type=get_value_or_default(
|
|
route.strict_content_type,
|
|
router.strict_content_type,
|
|
self.strict_content_type,
|
|
),
|
|
)
|
|
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[
|
|
int | None,
|
|
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[
|
|
list[str | Enum] | None,
|
|
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[
|
|
Sequence[params.Depends] | None,
|
|
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[
|
|
str | None,
|
|
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[
|
|
str | None,
|
|
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[
|
|
dict[int | str, dict[str, Any]] | None,
|
|
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[
|
|
bool | None,
|
|
Doc(
|
|
"""
|
|
Mark this *path operation* as deprecated.
|
|
|
|
It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
"""
|
|
),
|
|
] = None,
|
|
operation_id: Annotated[
|
|
str | None,
|
|
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[
|
|
IncEx | None,
|
|
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[
|
|
IncEx | None,
|
|
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[
|
|
str | None,
|
|
Doc(
|
|
"""
|
|
Name for this *path operation*. Only used internally.
|
|
"""
|
|
),
|
|
] = None,
|
|
callbacks: Annotated[
|
|
list[BaseRoute] | None,
|
|
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[
|
|
dict[str, Any] | None,
|
|
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[
|
|
int | None,
|
|
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[
|
|
list[str | Enum] | None,
|
|
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[
|
|
Sequence[params.Depends] | None,
|
|
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[
|
|
str | None,
|
|
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[
|
|
str | None,
|
|
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[
|
|
dict[int | str, dict[str, Any]] | None,
|
|
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[
|
|
bool | None,
|
|
Doc(
|
|
"""
|
|
Mark this *path operation* as deprecated.
|
|
|
|
It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
"""
|
|
),
|
|
] = None,
|
|
operation_id: Annotated[
|
|
str | None,
|
|
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[
|
|
IncEx | None,
|
|
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[
|
|
IncEx | None,
|
|
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[
|
|
str | None,
|
|
Doc(
|
|
"""
|
|
Name for this *path operation*. Only used internally.
|
|
"""
|
|
),
|
|
] = None,
|
|
callbacks: Annotated[
|
|
list[BaseRoute] | None,
|
|
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[
|
|
dict[str, Any] | None,
|
|
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[
|
|
int | None,
|
|
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[
|
|
list[str | Enum] | None,
|
|
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[
|
|
Sequence[params.Depends] | None,
|
|
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[
|
|
str | None,
|
|
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[
|
|
str | None,
|
|
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[
|
|
dict[int | str, dict[str, Any]] | None,
|
|
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[
|
|
bool | None,
|
|
Doc(
|
|
"""
|
|
Mark this *path operation* as deprecated.
|
|
|
|
It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
"""
|
|
),
|
|
] = None,
|
|
operation_id: Annotated[
|
|
str | None,
|
|
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[
|
|
IncEx | None,
|
|
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[
|
|
IncEx | None,
|
|
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[
|
|
str | None,
|
|
Doc(
|
|
"""
|
|
Name for this *path operation*. Only used internally.
|
|
"""
|
|
),
|
|
] = None,
|
|
callbacks: Annotated[
|
|
list[BaseRoute] | None,
|
|
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[
|
|
dict[str, Any] | None,
|
|
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[
|
|
int | None,
|
|
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[
|
|
list[str | Enum] | None,
|
|
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[
|
|
Sequence[params.Depends] | None,
|
|
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[
|
|
str | None,
|
|
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[
|
|
str | None,
|
|
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[
|
|
dict[int | str, dict[str, Any]] | None,
|
|
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[
|
|
bool | None,
|
|
Doc(
|
|
"""
|
|
Mark this *path operation* as deprecated.
|
|
|
|
It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
"""
|
|
),
|
|
] = None,
|
|
operation_id: Annotated[
|
|
str | None,
|
|
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[
|
|
IncEx | None,
|
|
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[
|
|
IncEx | None,
|
|
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[
|
|
str | None,
|
|
Doc(
|
|
"""
|
|
Name for this *path operation*. Only used internally.
|
|
"""
|
|
),
|
|
] = None,
|
|
callbacks: Annotated[
|
|
list[BaseRoute] | None,
|
|
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[
|
|
dict[str, Any] | None,
|
|
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[
|
|
int | None,
|
|
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[
|
|
list[str | Enum] | None,
|
|
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[
|
|
Sequence[params.Depends] | None,
|
|
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[
|
|
str | None,
|
|
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[
|
|
str | None,
|
|
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[
|
|
dict[int | str, dict[str, Any]] | None,
|
|
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[
|
|
bool | None,
|
|
Doc(
|
|
"""
|
|
Mark this *path operation* as deprecated.
|
|
|
|
It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
"""
|
|
),
|
|
] = None,
|
|
operation_id: Annotated[
|
|
str | None,
|
|
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[
|
|
IncEx | None,
|
|
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[
|
|
IncEx | None,
|
|
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[
|
|
str | None,
|
|
Doc(
|
|
"""
|
|
Name for this *path operation*. Only used internally.
|
|
"""
|
|
),
|
|
] = None,
|
|
callbacks: Annotated[
|
|
list[BaseRoute] | None,
|
|
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[
|
|
dict[str, Any] | None,
|
|
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[
|
|
int | None,
|
|
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[
|
|
list[str | Enum] | None,
|
|
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[
|
|
Sequence[params.Depends] | None,
|
|
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[
|
|
str | None,
|
|
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[
|
|
str | None,
|
|
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[
|
|
dict[int | str, dict[str, Any]] | None,
|
|
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[
|
|
bool | None,
|
|
Doc(
|
|
"""
|
|
Mark this *path operation* as deprecated.
|
|
|
|
It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
"""
|
|
),
|
|
] = None,
|
|
operation_id: Annotated[
|
|
str | None,
|
|
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[
|
|
IncEx | None,
|
|
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[
|
|
IncEx | None,
|
|
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[
|
|
str | None,
|
|
Doc(
|
|
"""
|
|
Name for this *path operation*. Only used internally.
|
|
"""
|
|
),
|
|
] = None,
|
|
callbacks: Annotated[
|
|
list[BaseRoute] | None,
|
|
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[
|
|
dict[str, Any] | None,
|
|
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[
|
|
int | None,
|
|
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[
|
|
list[str | Enum] | None,
|
|
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[
|
|
Sequence[params.Depends] | None,
|
|
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[
|
|
str | None,
|
|
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[
|
|
str | None,
|
|
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[
|
|
dict[int | str, dict[str, Any]] | None,
|
|
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[
|
|
bool | None,
|
|
Doc(
|
|
"""
|
|
Mark this *path operation* as deprecated.
|
|
|
|
It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
"""
|
|
),
|
|
] = None,
|
|
operation_id: Annotated[
|
|
str | None,
|
|
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[
|
|
IncEx | None,
|
|
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[
|
|
IncEx | None,
|
|
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[
|
|
str | None,
|
|
Doc(
|
|
"""
|
|
Name for this *path operation*. Only used internally.
|
|
"""
|
|
),
|
|
] = None,
|
|
callbacks: Annotated[
|
|
list[BaseRoute] | None,
|
|
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[
|
|
dict[str, Any] | None,
|
|
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[
|
|
int | None,
|
|
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[
|
|
list[str | Enum] | None,
|
|
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[
|
|
Sequence[params.Depends] | None,
|
|
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[
|
|
str | None,
|
|
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[
|
|
str | None,
|
|
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[
|
|
dict[int | str, dict[str, Any]] | None,
|
|
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[
|
|
bool | None,
|
|
Doc(
|
|
"""
|
|
Mark this *path operation* as deprecated.
|
|
|
|
It will be added to the generated OpenAPI (e.g. visible at `/docs`).
|
|
"""
|
|
),
|
|
] = None,
|
|
operation_id: Annotated[
|
|
str | None,
|
|
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[
|
|
IncEx | None,
|
|
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[
|
|
IncEx | None,
|
|
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[
|
|
str | None,
|
|
Doc(
|
|
"""
|
|
Name for this *path operation*. Only used internally.
|
|
"""
|
|
),
|
|
] = None,
|
|
callbacks: Annotated[
|
|
list[BaseRoute] | None,
|
|
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[
|
|
dict[str, Any] | None,
|
|
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,
|
|
)
|
|
|
|
# TODO: remove this once the lifespan (or alternative) interface is improved
|
|
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()
|
|
|
|
# TODO: remove this once the lifespan (or alternative) interface is improved
|
|
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()
|
|
|
|
# TODO: remove this once the lifespan (or alternative) interface is improved
|
|
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
|
|
|