| import warnings |
| from collections.abc import Callable, Sequence |
| from dataclasses import dataclass |
| from enum import Enum |
| from typing import Annotated, Any, Literal |
|
|
| from fastapi.exceptions import FastAPIDeprecationWarning |
| from fastapi.openapi.models import Example |
| from pydantic import AliasChoices, AliasPath |
| from pydantic.fields import FieldInfo |
| from typing_extensions import deprecated |
|
|
| from ._compat import ( |
| Undefined, |
| ) |
| from .datastructures import _Unset |
|
|
|
|
| class ParamTypes(Enum): |
| query = "query" |
| header = "header" |
| path = "path" |
| cookie = "cookie" |
|
|
|
|
| class Param(FieldInfo): |
| in_: ParamTypes |
|
|
| def __init__( |
| self, |
| default: Any = Undefined, |
| *, |
| default_factory: Callable[[], Any] | None = _Unset, |
| annotation: Any | None = None, |
| alias: str | None = None, |
| alias_priority: int | None = _Unset, |
| validation_alias: str | AliasPath | AliasChoices | None = None, |
| serialization_alias: str | None = None, |
| title: str | None = None, |
| description: str | None = None, |
| gt: float | None = None, |
| ge: float | None = None, |
| lt: float | None = None, |
| le: float | None = None, |
| min_length: int | None = None, |
| max_length: int | None = None, |
| pattern: str | None = None, |
| regex: Annotated[ |
| str | None, |
| deprecated( |
| "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." |
| ), |
| ] = None, |
| discriminator: str | None = None, |
| strict: bool | None = _Unset, |
| multiple_of: float | None = _Unset, |
| allow_inf_nan: bool | None = _Unset, |
| max_digits: int | None = _Unset, |
| decimal_places: int | None = _Unset, |
| examples: list[Any] | None = None, |
| example: Annotated[ |
| Any | None, |
| deprecated( |
| "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " |
| "although still supported. Use examples instead." |
| ), |
| ] = _Unset, |
| openapi_examples: dict[str, Example] | None = None, |
| deprecated: deprecated | str | bool | None = None, |
| include_in_schema: bool = True, |
| json_schema_extra: dict[str, Any] | None = None, |
| **extra: Any, |
| ): |
| if example is not _Unset: |
| warnings.warn( |
| "`example` has been deprecated, please use `examples` instead", |
| category=FastAPIDeprecationWarning, |
| stacklevel=4, |
| ) |
| self.example = example |
| self.include_in_schema = include_in_schema |
| self.openapi_examples = openapi_examples |
| kwargs = dict( |
| default=default, |
| default_factory=default_factory, |
| alias=alias, |
| title=title, |
| description=description, |
| gt=gt, |
| ge=ge, |
| lt=lt, |
| le=le, |
| min_length=min_length, |
| max_length=max_length, |
| discriminator=discriminator, |
| multiple_of=multiple_of, |
| allow_inf_nan=allow_inf_nan, |
| max_digits=max_digits, |
| decimal_places=decimal_places, |
| **extra, |
| ) |
| if examples is not None: |
| kwargs["examples"] = examples |
| if regex is not None: |
| warnings.warn( |
| "`regex` has been deprecated, please use `pattern` instead", |
| category=FastAPIDeprecationWarning, |
| stacklevel=4, |
| ) |
| current_json_schema_extra = json_schema_extra or extra |
| kwargs["deprecated"] = deprecated |
|
|
| if serialization_alias in (_Unset, None) and isinstance(alias, str): |
| serialization_alias = alias |
| if validation_alias in (_Unset, None): |
| validation_alias = alias |
| kwargs.update( |
| { |
| "annotation": annotation, |
| "alias_priority": alias_priority, |
| "validation_alias": validation_alias, |
| "serialization_alias": serialization_alias, |
| "strict": strict, |
| "json_schema_extra": current_json_schema_extra, |
| } |
| ) |
| kwargs["pattern"] = pattern or regex |
|
|
| use_kwargs = {k: v for k, v in kwargs.items() if v is not _Unset} |
|
|
| super().__init__(**use_kwargs) |
|
|
| def __repr__(self) -> str: |
| return f"{self.__class__.__name__}({self.default})" |
|
|
|
|
| class Path(Param): |
| in_ = ParamTypes.path |
|
|
| def __init__( |
| self, |
| default: Any = ..., |
| *, |
| default_factory: Callable[[], Any] | None = _Unset, |
| annotation: Any | None = None, |
| alias: str | None = None, |
| alias_priority: int | None = _Unset, |
| validation_alias: str | AliasPath | AliasChoices | None = None, |
| serialization_alias: str | None = None, |
| title: str | None = None, |
| description: str | None = None, |
| gt: float | None = None, |
| ge: float | None = None, |
| lt: float | None = None, |
| le: float | None = None, |
| min_length: int | None = None, |
| max_length: int | None = None, |
| pattern: str | None = None, |
| regex: Annotated[ |
| str | None, |
| deprecated( |
| "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." |
| ), |
| ] = None, |
| discriminator: str | None = None, |
| strict: bool | None = _Unset, |
| multiple_of: float | None = _Unset, |
| allow_inf_nan: bool | None = _Unset, |
| max_digits: int | None = _Unset, |
| decimal_places: int | None = _Unset, |
| examples: list[Any] | None = None, |
| example: Annotated[ |
| Any | None, |
| deprecated( |
| "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " |
| "although still supported. Use examples instead." |
| ), |
| ] = _Unset, |
| openapi_examples: dict[str, Example] | None = None, |
| deprecated: deprecated | str | bool | None = None, |
| include_in_schema: bool = True, |
| json_schema_extra: dict[str, Any] | None = None, |
| **extra: Any, |
| ): |
| assert default is ..., "Path parameters cannot have a default value" |
| self.in_ = self.in_ |
| super().__init__( |
| default=default, |
| default_factory=default_factory, |
| annotation=annotation, |
| alias=alias, |
| alias_priority=alias_priority, |
| validation_alias=validation_alias, |
| serialization_alias=serialization_alias, |
| title=title, |
| description=description, |
| gt=gt, |
| ge=ge, |
| lt=lt, |
| le=le, |
| min_length=min_length, |
| max_length=max_length, |
| pattern=pattern, |
| regex=regex, |
| discriminator=discriminator, |
| strict=strict, |
| multiple_of=multiple_of, |
| allow_inf_nan=allow_inf_nan, |
| max_digits=max_digits, |
| decimal_places=decimal_places, |
| deprecated=deprecated, |
| example=example, |
| examples=examples, |
| openapi_examples=openapi_examples, |
| include_in_schema=include_in_schema, |
| json_schema_extra=json_schema_extra, |
| **extra, |
| ) |
|
|
|
|
| class Query(Param): |
| in_ = ParamTypes.query |
|
|
| def __init__( |
| self, |
| default: Any = Undefined, |
| *, |
| default_factory: Callable[[], Any] | None = _Unset, |
| annotation: Any | None = None, |
| alias: str | None = None, |
| alias_priority: int | None = _Unset, |
| validation_alias: str | AliasPath | AliasChoices | None = None, |
| serialization_alias: str | None = None, |
| title: str | None = None, |
| description: str | None = None, |
| gt: float | None = None, |
| ge: float | None = None, |
| lt: float | None = None, |
| le: float | None = None, |
| min_length: int | None = None, |
| max_length: int | None = None, |
| pattern: str | None = None, |
| regex: Annotated[ |
| str | None, |
| deprecated( |
| "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." |
| ), |
| ] = None, |
| discriminator: str | None = None, |
| strict: bool | None = _Unset, |
| multiple_of: float | None = _Unset, |
| allow_inf_nan: bool | None = _Unset, |
| max_digits: int | None = _Unset, |
| decimal_places: int | None = _Unset, |
| examples: list[Any] | None = None, |
| example: Annotated[ |
| Any | None, |
| deprecated( |
| "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " |
| "although still supported. Use examples instead." |
| ), |
| ] = _Unset, |
| openapi_examples: dict[str, Example] | None = None, |
| deprecated: deprecated | str | bool | None = None, |
| include_in_schema: bool = True, |
| json_schema_extra: dict[str, Any] | None = None, |
| **extra: Any, |
| ): |
| super().__init__( |
| default=default, |
| default_factory=default_factory, |
| annotation=annotation, |
| alias=alias, |
| alias_priority=alias_priority, |
| validation_alias=validation_alias, |
| serialization_alias=serialization_alias, |
| title=title, |
| description=description, |
| gt=gt, |
| ge=ge, |
| lt=lt, |
| le=le, |
| min_length=min_length, |
| max_length=max_length, |
| pattern=pattern, |
| regex=regex, |
| discriminator=discriminator, |
| strict=strict, |
| multiple_of=multiple_of, |
| allow_inf_nan=allow_inf_nan, |
| max_digits=max_digits, |
| decimal_places=decimal_places, |
| deprecated=deprecated, |
| example=example, |
| examples=examples, |
| openapi_examples=openapi_examples, |
| include_in_schema=include_in_schema, |
| json_schema_extra=json_schema_extra, |
| **extra, |
| ) |
|
|
|
|
| class Header(Param): |
| in_ = ParamTypes.header |
|
|
| def __init__( |
| self, |
| default: Any = Undefined, |
| *, |
| default_factory: Callable[[], Any] | None = _Unset, |
| annotation: Any | None = None, |
| alias: str | None = None, |
| alias_priority: int | None = _Unset, |
| validation_alias: str | AliasPath | AliasChoices | None = None, |
| serialization_alias: str | None = None, |
| convert_underscores: bool = True, |
| title: str | None = None, |
| description: str | None = None, |
| gt: float | None = None, |
| ge: float | None = None, |
| lt: float | None = None, |
| le: float | None = None, |
| min_length: int | None = None, |
| max_length: int | None = None, |
| pattern: str | None = None, |
| regex: Annotated[ |
| str | None, |
| deprecated( |
| "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." |
| ), |
| ] = None, |
| discriminator: str | None = None, |
| strict: bool | None = _Unset, |
| multiple_of: float | None = _Unset, |
| allow_inf_nan: bool | None = _Unset, |
| max_digits: int | None = _Unset, |
| decimal_places: int | None = _Unset, |
| examples: list[Any] | None = None, |
| example: Annotated[ |
| Any | None, |
| deprecated( |
| "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " |
| "although still supported. Use examples instead." |
| ), |
| ] = _Unset, |
| openapi_examples: dict[str, Example] | None = None, |
| deprecated: deprecated | str | bool | None = None, |
| include_in_schema: bool = True, |
| json_schema_extra: dict[str, Any] | None = None, |
| **extra: Any, |
| ): |
| self.convert_underscores = convert_underscores |
| super().__init__( |
| default=default, |
| default_factory=default_factory, |
| annotation=annotation, |
| alias=alias, |
| alias_priority=alias_priority, |
| validation_alias=validation_alias, |
| serialization_alias=serialization_alias, |
| title=title, |
| description=description, |
| gt=gt, |
| ge=ge, |
| lt=lt, |
| le=le, |
| min_length=min_length, |
| max_length=max_length, |
| pattern=pattern, |
| regex=regex, |
| discriminator=discriminator, |
| strict=strict, |
| multiple_of=multiple_of, |
| allow_inf_nan=allow_inf_nan, |
| max_digits=max_digits, |
| decimal_places=decimal_places, |
| deprecated=deprecated, |
| example=example, |
| examples=examples, |
| openapi_examples=openapi_examples, |
| include_in_schema=include_in_schema, |
| json_schema_extra=json_schema_extra, |
| **extra, |
| ) |
|
|
|
|
| class Cookie(Param): |
| in_ = ParamTypes.cookie |
|
|
| def __init__( |
| self, |
| default: Any = Undefined, |
| *, |
| default_factory: Callable[[], Any] | None = _Unset, |
| annotation: Any | None = None, |
| alias: str | None = None, |
| alias_priority: int | None = _Unset, |
| validation_alias: str | AliasPath | AliasChoices | None = None, |
| serialization_alias: str | None = None, |
| title: str | None = None, |
| description: str | None = None, |
| gt: float | None = None, |
| ge: float | None = None, |
| lt: float | None = None, |
| le: float | None = None, |
| min_length: int | None = None, |
| max_length: int | None = None, |
| pattern: str | None = None, |
| regex: Annotated[ |
| str | None, |
| deprecated( |
| "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." |
| ), |
| ] = None, |
| discriminator: str | None = None, |
| strict: bool | None = _Unset, |
| multiple_of: float | None = _Unset, |
| allow_inf_nan: bool | None = _Unset, |
| max_digits: int | None = _Unset, |
| decimal_places: int | None = _Unset, |
| examples: list[Any] | None = None, |
| example: Annotated[ |
| Any | None, |
| deprecated( |
| "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " |
| "although still supported. Use examples instead." |
| ), |
| ] = _Unset, |
| openapi_examples: dict[str, Example] | None = None, |
| deprecated: deprecated | str | bool | None = None, |
| include_in_schema: bool = True, |
| json_schema_extra: dict[str, Any] | None = None, |
| **extra: Any, |
| ): |
| super().__init__( |
| default=default, |
| default_factory=default_factory, |
| annotation=annotation, |
| alias=alias, |
| alias_priority=alias_priority, |
| validation_alias=validation_alias, |
| serialization_alias=serialization_alias, |
| title=title, |
| description=description, |
| gt=gt, |
| ge=ge, |
| lt=lt, |
| le=le, |
| min_length=min_length, |
| max_length=max_length, |
| pattern=pattern, |
| regex=regex, |
| discriminator=discriminator, |
| strict=strict, |
| multiple_of=multiple_of, |
| allow_inf_nan=allow_inf_nan, |
| max_digits=max_digits, |
| decimal_places=decimal_places, |
| deprecated=deprecated, |
| example=example, |
| examples=examples, |
| openapi_examples=openapi_examples, |
| include_in_schema=include_in_schema, |
| json_schema_extra=json_schema_extra, |
| **extra, |
| ) |
|
|
|
|
| class Body(FieldInfo): |
| def __init__( |
| self, |
| default: Any = Undefined, |
| *, |
| default_factory: Callable[[], Any] | None = _Unset, |
| annotation: Any | None = None, |
| embed: bool | None = None, |
| media_type: str = "application/json", |
| alias: str | None = None, |
| alias_priority: int | None = _Unset, |
| validation_alias: str | AliasPath | AliasChoices | None = None, |
| serialization_alias: str | None = None, |
| title: str | None = None, |
| description: str | None = None, |
| gt: float | None = None, |
| ge: float | None = None, |
| lt: float | None = None, |
| le: float | None = None, |
| min_length: int | None = None, |
| max_length: int | None = None, |
| pattern: str | None = None, |
| regex: Annotated[ |
| str | None, |
| deprecated( |
| "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." |
| ), |
| ] = None, |
| discriminator: str | None = None, |
| strict: bool | None = _Unset, |
| multiple_of: float | None = _Unset, |
| allow_inf_nan: bool | None = _Unset, |
| max_digits: int | None = _Unset, |
| decimal_places: int | None = _Unset, |
| examples: list[Any] | None = None, |
| example: Annotated[ |
| Any | None, |
| deprecated( |
| "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " |
| "although still supported. Use examples instead." |
| ), |
| ] = _Unset, |
| openapi_examples: dict[str, Example] | None = None, |
| deprecated: deprecated | str | bool | None = None, |
| include_in_schema: bool = True, |
| json_schema_extra: dict[str, Any] | None = None, |
| **extra: Any, |
| ): |
| self.embed = embed |
| self.media_type = media_type |
| if example is not _Unset: |
| warnings.warn( |
| "`example` has been deprecated, please use `examples` instead", |
| category=FastAPIDeprecationWarning, |
| stacklevel=4, |
| ) |
| self.example = example |
| self.include_in_schema = include_in_schema |
| self.openapi_examples = openapi_examples |
| kwargs = dict( |
| default=default, |
| default_factory=default_factory, |
| alias=alias, |
| title=title, |
| description=description, |
| gt=gt, |
| ge=ge, |
| lt=lt, |
| le=le, |
| min_length=min_length, |
| max_length=max_length, |
| discriminator=discriminator, |
| multiple_of=multiple_of, |
| allow_inf_nan=allow_inf_nan, |
| max_digits=max_digits, |
| decimal_places=decimal_places, |
| **extra, |
| ) |
| if examples is not None: |
| kwargs["examples"] = examples |
| if regex is not None: |
| warnings.warn( |
| "`regex` has been deprecated, please use `pattern` instead", |
| category=FastAPIDeprecationWarning, |
| stacklevel=4, |
| ) |
| current_json_schema_extra = json_schema_extra or extra |
| kwargs["deprecated"] = deprecated |
| if serialization_alias in (_Unset, None) and isinstance(alias, str): |
| serialization_alias = alias |
| if validation_alias in (_Unset, None): |
| validation_alias = alias |
| kwargs.update( |
| { |
| "annotation": annotation, |
| "alias_priority": alias_priority, |
| "validation_alias": validation_alias, |
| "serialization_alias": serialization_alias, |
| "strict": strict, |
| "json_schema_extra": current_json_schema_extra, |
| } |
| ) |
| kwargs["pattern"] = pattern or regex |
|
|
| use_kwargs = {k: v for k, v in kwargs.items() if v is not _Unset} |
|
|
| super().__init__(**use_kwargs) |
|
|
| def __repr__(self) -> str: |
| return f"{self.__class__.__name__}({self.default})" |
|
|
|
|
| class Form(Body): |
| def __init__( |
| self, |
| default: Any = Undefined, |
| *, |
| default_factory: Callable[[], Any] | None = _Unset, |
| annotation: Any | None = None, |
| media_type: str = "application/x-www-form-urlencoded", |
| alias: str | None = None, |
| alias_priority: int | None = _Unset, |
| validation_alias: str | AliasPath | AliasChoices | None = None, |
| serialization_alias: str | None = None, |
| title: str | None = None, |
| description: str | None = None, |
| gt: float | None = None, |
| ge: float | None = None, |
| lt: float | None = None, |
| le: float | None = None, |
| min_length: int | None = None, |
| max_length: int | None = None, |
| pattern: str | None = None, |
| regex: Annotated[ |
| str | None, |
| deprecated( |
| "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." |
| ), |
| ] = None, |
| discriminator: str | None = None, |
| strict: bool | None = _Unset, |
| multiple_of: float | None = _Unset, |
| allow_inf_nan: bool | None = _Unset, |
| max_digits: int | None = _Unset, |
| decimal_places: int | None = _Unset, |
| examples: list[Any] | None = None, |
| example: Annotated[ |
| Any | None, |
| deprecated( |
| "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " |
| "although still supported. Use examples instead." |
| ), |
| ] = _Unset, |
| openapi_examples: dict[str, Example] | None = None, |
| deprecated: deprecated | str | bool | None = None, |
| include_in_schema: bool = True, |
| json_schema_extra: dict[str, Any] | None = None, |
| **extra: Any, |
| ): |
| super().__init__( |
| default=default, |
| default_factory=default_factory, |
| annotation=annotation, |
| media_type=media_type, |
| alias=alias, |
| alias_priority=alias_priority, |
| validation_alias=validation_alias, |
| serialization_alias=serialization_alias, |
| title=title, |
| description=description, |
| gt=gt, |
| ge=ge, |
| lt=lt, |
| le=le, |
| min_length=min_length, |
| max_length=max_length, |
| pattern=pattern, |
| regex=regex, |
| discriminator=discriminator, |
| strict=strict, |
| multiple_of=multiple_of, |
| allow_inf_nan=allow_inf_nan, |
| max_digits=max_digits, |
| decimal_places=decimal_places, |
| deprecated=deprecated, |
| example=example, |
| examples=examples, |
| openapi_examples=openapi_examples, |
| include_in_schema=include_in_schema, |
| json_schema_extra=json_schema_extra, |
| **extra, |
| ) |
|
|
|
|
| class File(Form): |
| def __init__( |
| self, |
| default: Any = Undefined, |
| *, |
| default_factory: Callable[[], Any] | None = _Unset, |
| annotation: Any | None = None, |
| media_type: str = "multipart/form-data", |
| alias: str | None = None, |
| alias_priority: int | None = _Unset, |
| validation_alias: str | AliasPath | AliasChoices | None = None, |
| serialization_alias: str | None = None, |
| title: str | None = None, |
| description: str | None = None, |
| gt: float | None = None, |
| ge: float | None = None, |
| lt: float | None = None, |
| le: float | None = None, |
| min_length: int | None = None, |
| max_length: int | None = None, |
| pattern: str | None = None, |
| regex: Annotated[ |
| str | None, |
| deprecated( |
| "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead." |
| ), |
| ] = None, |
| discriminator: str | None = None, |
| strict: bool | None = _Unset, |
| multiple_of: float | None = _Unset, |
| allow_inf_nan: bool | None = _Unset, |
| max_digits: int | None = _Unset, |
| decimal_places: int | None = _Unset, |
| examples: list[Any] | None = None, |
| example: Annotated[ |
| Any | None, |
| deprecated( |
| "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, " |
| "although still supported. Use examples instead." |
| ), |
| ] = _Unset, |
| openapi_examples: dict[str, Example] | None = None, |
| deprecated: deprecated | str | bool | None = None, |
| include_in_schema: bool = True, |
| json_schema_extra: dict[str, Any] | None = None, |
| **extra: Any, |
| ): |
| super().__init__( |
| default=default, |
| default_factory=default_factory, |
| annotation=annotation, |
| media_type=media_type, |
| alias=alias, |
| alias_priority=alias_priority, |
| validation_alias=validation_alias, |
| serialization_alias=serialization_alias, |
| title=title, |
| description=description, |
| gt=gt, |
| ge=ge, |
| lt=lt, |
| le=le, |
| min_length=min_length, |
| max_length=max_length, |
| pattern=pattern, |
| regex=regex, |
| discriminator=discriminator, |
| strict=strict, |
| multiple_of=multiple_of, |
| allow_inf_nan=allow_inf_nan, |
| max_digits=max_digits, |
| decimal_places=decimal_places, |
| deprecated=deprecated, |
| example=example, |
| examples=examples, |
| openapi_examples=openapi_examples, |
| include_in_schema=include_in_schema, |
| json_schema_extra=json_schema_extra, |
| **extra, |
| ) |
|
|
|
|
| @dataclass(frozen=True) |
| class Depends: |
| dependency: Callable[..., Any] | None = None |
| use_cache: bool = True |
| scope: Literal["function", "request"] | None = None |
|
|
|
|
| @dataclass(frozen=True) |
| class Security(Depends): |
| scopes: Sequence[str] | None = None |
|
|