params.py 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777
  1. import warnings
  2. from enum import Enum
  3. from typing import Any, Callable, Dict, List, Optional, Sequence, Union
  4. from fastapi.openapi.models import Example
  5. from pydantic.fields import FieldInfo
  6. from typing_extensions import Annotated, deprecated
  7. from ._compat import PYDANTIC_V2, Undefined
  8. _Unset: Any = Undefined
  9. class ParamTypes(Enum):
  10. query = "query"
  11. header = "header"
  12. path = "path"
  13. cookie = "cookie"
  14. class Param(FieldInfo):
  15. in_: ParamTypes
  16. def __init__(
  17. self,
  18. default: Any = Undefined,
  19. *,
  20. default_factory: Union[Callable[[], Any], None] = _Unset,
  21. annotation: Optional[Any] = None,
  22. alias: Optional[str] = None,
  23. alias_priority: Union[int, None] = _Unset,
  24. # TODO: update when deprecating Pydantic v1, import these types
  25. # validation_alias: str | AliasPath | AliasChoices | None
  26. validation_alias: Union[str, None] = None,
  27. serialization_alias: Union[str, None] = None,
  28. title: Optional[str] = None,
  29. description: Optional[str] = None,
  30. gt: Optional[float] = None,
  31. ge: Optional[float] = None,
  32. lt: Optional[float] = None,
  33. le: Optional[float] = None,
  34. min_length: Optional[int] = None,
  35. max_length: Optional[int] = None,
  36. pattern: Optional[str] = None,
  37. regex: Annotated[
  38. Optional[str],
  39. deprecated(
  40. "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead."
  41. ),
  42. ] = None,
  43. discriminator: Union[str, None] = None,
  44. strict: Union[bool, None] = _Unset,
  45. multiple_of: Union[float, None] = _Unset,
  46. allow_inf_nan: Union[bool, None] = _Unset,
  47. max_digits: Union[int, None] = _Unset,
  48. decimal_places: Union[int, None] = _Unset,
  49. examples: Optional[List[Any]] = None,
  50. example: Annotated[
  51. Optional[Any],
  52. deprecated(
  53. "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, "
  54. "although still supported. Use examples instead."
  55. ),
  56. ] = _Unset,
  57. openapi_examples: Optional[Dict[str, Example]] = None,
  58. deprecated: Optional[bool] = None,
  59. include_in_schema: bool = True,
  60. json_schema_extra: Union[Dict[str, Any], None] = None,
  61. **extra: Any,
  62. ):
  63. self.deprecated = deprecated
  64. if example is not _Unset:
  65. warnings.warn(
  66. "`example` has been deprecated, please use `examples` instead",
  67. category=DeprecationWarning,
  68. stacklevel=4,
  69. )
  70. self.example = example
  71. self.include_in_schema = include_in_schema
  72. self.openapi_examples = openapi_examples
  73. kwargs = dict(
  74. default=default,
  75. default_factory=default_factory,
  76. alias=alias,
  77. title=title,
  78. description=description,
  79. gt=gt,
  80. ge=ge,
  81. lt=lt,
  82. le=le,
  83. min_length=min_length,
  84. max_length=max_length,
  85. discriminator=discriminator,
  86. multiple_of=multiple_of,
  87. allow_nan=allow_inf_nan,
  88. max_digits=max_digits,
  89. decimal_places=decimal_places,
  90. **extra,
  91. )
  92. if examples is not None:
  93. kwargs["examples"] = examples
  94. if regex is not None:
  95. warnings.warn(
  96. "`regex` has been deprecated, please use `pattern` instead",
  97. category=DeprecationWarning,
  98. stacklevel=4,
  99. )
  100. current_json_schema_extra = json_schema_extra or extra
  101. if PYDANTIC_V2:
  102. kwargs.update(
  103. {
  104. "annotation": annotation,
  105. "alias_priority": alias_priority,
  106. "validation_alias": validation_alias,
  107. "serialization_alias": serialization_alias,
  108. "strict": strict,
  109. "json_schema_extra": current_json_schema_extra,
  110. }
  111. )
  112. kwargs["pattern"] = pattern or regex
  113. else:
  114. kwargs["regex"] = pattern or regex
  115. kwargs.update(**current_json_schema_extra)
  116. use_kwargs = {k: v for k, v in kwargs.items() if v is not _Unset}
  117. super().__init__(**use_kwargs)
  118. def __repr__(self) -> str:
  119. return f"{self.__class__.__name__}({self.default})"
  120. class Path(Param):
  121. in_ = ParamTypes.path
  122. def __init__(
  123. self,
  124. default: Any = ...,
  125. *,
  126. default_factory: Union[Callable[[], Any], None] = _Unset,
  127. annotation: Optional[Any] = None,
  128. alias: Optional[str] = None,
  129. alias_priority: Union[int, None] = _Unset,
  130. # TODO: update when deprecating Pydantic v1, import these types
  131. # validation_alias: str | AliasPath | AliasChoices | None
  132. validation_alias: Union[str, None] = None,
  133. serialization_alias: Union[str, None] = None,
  134. title: Optional[str] = None,
  135. description: Optional[str] = None,
  136. gt: Optional[float] = None,
  137. ge: Optional[float] = None,
  138. lt: Optional[float] = None,
  139. le: Optional[float] = None,
  140. min_length: Optional[int] = None,
  141. max_length: Optional[int] = None,
  142. pattern: Optional[str] = None,
  143. regex: Annotated[
  144. Optional[str],
  145. deprecated(
  146. "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead."
  147. ),
  148. ] = None,
  149. discriminator: Union[str, None] = None,
  150. strict: Union[bool, None] = _Unset,
  151. multiple_of: Union[float, None] = _Unset,
  152. allow_inf_nan: Union[bool, None] = _Unset,
  153. max_digits: Union[int, None] = _Unset,
  154. decimal_places: Union[int, None] = _Unset,
  155. examples: Optional[List[Any]] = None,
  156. example: Annotated[
  157. Optional[Any],
  158. deprecated(
  159. "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, "
  160. "although still supported. Use examples instead."
  161. ),
  162. ] = _Unset,
  163. openapi_examples: Optional[Dict[str, Example]] = None,
  164. deprecated: Optional[bool] = None,
  165. include_in_schema: bool = True,
  166. json_schema_extra: Union[Dict[str, Any], None] = None,
  167. **extra: Any,
  168. ):
  169. assert default is ..., "Path parameters cannot have a default value"
  170. self.in_ = self.in_
  171. super().__init__(
  172. default=default,
  173. default_factory=default_factory,
  174. annotation=annotation,
  175. alias=alias,
  176. alias_priority=alias_priority,
  177. validation_alias=validation_alias,
  178. serialization_alias=serialization_alias,
  179. title=title,
  180. description=description,
  181. gt=gt,
  182. ge=ge,
  183. lt=lt,
  184. le=le,
  185. min_length=min_length,
  186. max_length=max_length,
  187. pattern=pattern,
  188. regex=regex,
  189. discriminator=discriminator,
  190. strict=strict,
  191. multiple_of=multiple_of,
  192. allow_inf_nan=allow_inf_nan,
  193. max_digits=max_digits,
  194. decimal_places=decimal_places,
  195. deprecated=deprecated,
  196. example=example,
  197. examples=examples,
  198. openapi_examples=openapi_examples,
  199. include_in_schema=include_in_schema,
  200. json_schema_extra=json_schema_extra,
  201. **extra,
  202. )
  203. class Query(Param):
  204. in_ = ParamTypes.query
  205. def __init__(
  206. self,
  207. default: Any = Undefined,
  208. *,
  209. default_factory: Union[Callable[[], Any], None] = _Unset,
  210. annotation: Optional[Any] = None,
  211. alias: Optional[str] = None,
  212. alias_priority: Union[int, None] = _Unset,
  213. # TODO: update when deprecating Pydantic v1, import these types
  214. # validation_alias: str | AliasPath | AliasChoices | None
  215. validation_alias: Union[str, None] = None,
  216. serialization_alias: Union[str, None] = None,
  217. title: Optional[str] = None,
  218. description: Optional[str] = None,
  219. gt: Optional[float] = None,
  220. ge: Optional[float] = None,
  221. lt: Optional[float] = None,
  222. le: Optional[float] = None,
  223. min_length: Optional[int] = None,
  224. max_length: Optional[int] = None,
  225. pattern: Optional[str] = None,
  226. regex: Annotated[
  227. Optional[str],
  228. deprecated(
  229. "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead."
  230. ),
  231. ] = None,
  232. discriminator: Union[str, None] = None,
  233. strict: Union[bool, None] = _Unset,
  234. multiple_of: Union[float, None] = _Unset,
  235. allow_inf_nan: Union[bool, None] = _Unset,
  236. max_digits: Union[int, None] = _Unset,
  237. decimal_places: Union[int, None] = _Unset,
  238. examples: Optional[List[Any]] = None,
  239. example: Annotated[
  240. Optional[Any],
  241. deprecated(
  242. "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, "
  243. "although still supported. Use examples instead."
  244. ),
  245. ] = _Unset,
  246. openapi_examples: Optional[Dict[str, Example]] = None,
  247. deprecated: Optional[bool] = None,
  248. include_in_schema: bool = True,
  249. json_schema_extra: Union[Dict[str, Any], None] = None,
  250. **extra: Any,
  251. ):
  252. super().__init__(
  253. default=default,
  254. default_factory=default_factory,
  255. annotation=annotation,
  256. alias=alias,
  257. alias_priority=alias_priority,
  258. validation_alias=validation_alias,
  259. serialization_alias=serialization_alias,
  260. title=title,
  261. description=description,
  262. gt=gt,
  263. ge=ge,
  264. lt=lt,
  265. le=le,
  266. min_length=min_length,
  267. max_length=max_length,
  268. pattern=pattern,
  269. regex=regex,
  270. discriminator=discriminator,
  271. strict=strict,
  272. multiple_of=multiple_of,
  273. allow_inf_nan=allow_inf_nan,
  274. max_digits=max_digits,
  275. decimal_places=decimal_places,
  276. deprecated=deprecated,
  277. example=example,
  278. examples=examples,
  279. openapi_examples=openapi_examples,
  280. include_in_schema=include_in_schema,
  281. json_schema_extra=json_schema_extra,
  282. **extra,
  283. )
  284. class Header(Param):
  285. in_ = ParamTypes.header
  286. def __init__(
  287. self,
  288. default: Any = Undefined,
  289. *,
  290. default_factory: Union[Callable[[], Any], None] = _Unset,
  291. annotation: Optional[Any] = None,
  292. alias: Optional[str] = None,
  293. alias_priority: Union[int, None] = _Unset,
  294. # TODO: update when deprecating Pydantic v1, import these types
  295. # validation_alias: str | AliasPath | AliasChoices | None
  296. validation_alias: Union[str, None] = None,
  297. serialization_alias: Union[str, None] = None,
  298. convert_underscores: bool = True,
  299. title: Optional[str] = None,
  300. description: Optional[str] = None,
  301. gt: Optional[float] = None,
  302. ge: Optional[float] = None,
  303. lt: Optional[float] = None,
  304. le: Optional[float] = None,
  305. min_length: Optional[int] = None,
  306. max_length: Optional[int] = None,
  307. pattern: Optional[str] = None,
  308. regex: Annotated[
  309. Optional[str],
  310. deprecated(
  311. "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead."
  312. ),
  313. ] = None,
  314. discriminator: Union[str, None] = None,
  315. strict: Union[bool, None] = _Unset,
  316. multiple_of: Union[float, None] = _Unset,
  317. allow_inf_nan: Union[bool, None] = _Unset,
  318. max_digits: Union[int, None] = _Unset,
  319. decimal_places: Union[int, None] = _Unset,
  320. examples: Optional[List[Any]] = None,
  321. example: Annotated[
  322. Optional[Any],
  323. deprecated(
  324. "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, "
  325. "although still supported. Use examples instead."
  326. ),
  327. ] = _Unset,
  328. openapi_examples: Optional[Dict[str, Example]] = None,
  329. deprecated: Optional[bool] = None,
  330. include_in_schema: bool = True,
  331. json_schema_extra: Union[Dict[str, Any], None] = None,
  332. **extra: Any,
  333. ):
  334. self.convert_underscores = convert_underscores
  335. super().__init__(
  336. default=default,
  337. default_factory=default_factory,
  338. annotation=annotation,
  339. alias=alias,
  340. alias_priority=alias_priority,
  341. validation_alias=validation_alias,
  342. serialization_alias=serialization_alias,
  343. title=title,
  344. description=description,
  345. gt=gt,
  346. ge=ge,
  347. lt=lt,
  348. le=le,
  349. min_length=min_length,
  350. max_length=max_length,
  351. pattern=pattern,
  352. regex=regex,
  353. discriminator=discriminator,
  354. strict=strict,
  355. multiple_of=multiple_of,
  356. allow_inf_nan=allow_inf_nan,
  357. max_digits=max_digits,
  358. decimal_places=decimal_places,
  359. deprecated=deprecated,
  360. example=example,
  361. examples=examples,
  362. openapi_examples=openapi_examples,
  363. include_in_schema=include_in_schema,
  364. json_schema_extra=json_schema_extra,
  365. **extra,
  366. )
  367. class Cookie(Param):
  368. in_ = ParamTypes.cookie
  369. def __init__(
  370. self,
  371. default: Any = Undefined,
  372. *,
  373. default_factory: Union[Callable[[], Any], None] = _Unset,
  374. annotation: Optional[Any] = None,
  375. alias: Optional[str] = None,
  376. alias_priority: Union[int, None] = _Unset,
  377. # TODO: update when deprecating Pydantic v1, import these types
  378. # validation_alias: str | AliasPath | AliasChoices | None
  379. validation_alias: Union[str, None] = None,
  380. serialization_alias: Union[str, None] = None,
  381. title: Optional[str] = None,
  382. description: Optional[str] = None,
  383. gt: Optional[float] = None,
  384. ge: Optional[float] = None,
  385. lt: Optional[float] = None,
  386. le: Optional[float] = None,
  387. min_length: Optional[int] = None,
  388. max_length: Optional[int] = None,
  389. pattern: Optional[str] = None,
  390. regex: Annotated[
  391. Optional[str],
  392. deprecated(
  393. "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead."
  394. ),
  395. ] = None,
  396. discriminator: Union[str, None] = None,
  397. strict: Union[bool, None] = _Unset,
  398. multiple_of: Union[float, None] = _Unset,
  399. allow_inf_nan: Union[bool, None] = _Unset,
  400. max_digits: Union[int, None] = _Unset,
  401. decimal_places: Union[int, None] = _Unset,
  402. examples: Optional[List[Any]] = None,
  403. example: Annotated[
  404. Optional[Any],
  405. deprecated(
  406. "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, "
  407. "although still supported. Use examples instead."
  408. ),
  409. ] = _Unset,
  410. openapi_examples: Optional[Dict[str, Example]] = None,
  411. deprecated: Optional[bool] = None,
  412. include_in_schema: bool = True,
  413. json_schema_extra: Union[Dict[str, Any], None] = None,
  414. **extra: Any,
  415. ):
  416. super().__init__(
  417. default=default,
  418. default_factory=default_factory,
  419. annotation=annotation,
  420. alias=alias,
  421. alias_priority=alias_priority,
  422. validation_alias=validation_alias,
  423. serialization_alias=serialization_alias,
  424. title=title,
  425. description=description,
  426. gt=gt,
  427. ge=ge,
  428. lt=lt,
  429. le=le,
  430. min_length=min_length,
  431. max_length=max_length,
  432. pattern=pattern,
  433. regex=regex,
  434. discriminator=discriminator,
  435. strict=strict,
  436. multiple_of=multiple_of,
  437. allow_inf_nan=allow_inf_nan,
  438. max_digits=max_digits,
  439. decimal_places=decimal_places,
  440. deprecated=deprecated,
  441. example=example,
  442. examples=examples,
  443. openapi_examples=openapi_examples,
  444. include_in_schema=include_in_schema,
  445. json_schema_extra=json_schema_extra,
  446. **extra,
  447. )
  448. class Body(FieldInfo):
  449. def __init__(
  450. self,
  451. default: Any = Undefined,
  452. *,
  453. default_factory: Union[Callable[[], Any], None] = _Unset,
  454. annotation: Optional[Any] = None,
  455. embed: bool = False,
  456. media_type: str = "application/json",
  457. alias: Optional[str] = None,
  458. alias_priority: Union[int, None] = _Unset,
  459. # TODO: update when deprecating Pydantic v1, import these types
  460. # validation_alias: str | AliasPath | AliasChoices | None
  461. validation_alias: Union[str, None] = None,
  462. serialization_alias: Union[str, None] = None,
  463. title: Optional[str] = None,
  464. description: Optional[str] = None,
  465. gt: Optional[float] = None,
  466. ge: Optional[float] = None,
  467. lt: Optional[float] = None,
  468. le: Optional[float] = None,
  469. min_length: Optional[int] = None,
  470. max_length: Optional[int] = None,
  471. pattern: Optional[str] = None,
  472. regex: Annotated[
  473. Optional[str],
  474. deprecated(
  475. "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead."
  476. ),
  477. ] = None,
  478. discriminator: Union[str, None] = None,
  479. strict: Union[bool, None] = _Unset,
  480. multiple_of: Union[float, None] = _Unset,
  481. allow_inf_nan: Union[bool, None] = _Unset,
  482. max_digits: Union[int, None] = _Unset,
  483. decimal_places: Union[int, None] = _Unset,
  484. examples: Optional[List[Any]] = None,
  485. example: Annotated[
  486. Optional[Any],
  487. deprecated(
  488. "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, "
  489. "although still supported. Use examples instead."
  490. ),
  491. ] = _Unset,
  492. openapi_examples: Optional[Dict[str, Example]] = None,
  493. deprecated: Optional[bool] = None,
  494. include_in_schema: bool = True,
  495. json_schema_extra: Union[Dict[str, Any], None] = None,
  496. **extra: Any,
  497. ):
  498. self.embed = embed
  499. self.media_type = media_type
  500. self.deprecated = deprecated
  501. if example is not _Unset:
  502. warnings.warn(
  503. "`example` has been deprecated, please use `examples` instead",
  504. category=DeprecationWarning,
  505. stacklevel=4,
  506. )
  507. self.example = example
  508. self.include_in_schema = include_in_schema
  509. self.openapi_examples = openapi_examples
  510. kwargs = dict(
  511. default=default,
  512. default_factory=default_factory,
  513. alias=alias,
  514. title=title,
  515. description=description,
  516. gt=gt,
  517. ge=ge,
  518. lt=lt,
  519. le=le,
  520. min_length=min_length,
  521. max_length=max_length,
  522. discriminator=discriminator,
  523. multiple_of=multiple_of,
  524. allow_nan=allow_inf_nan,
  525. max_digits=max_digits,
  526. decimal_places=decimal_places,
  527. **extra,
  528. )
  529. if examples is not None:
  530. kwargs["examples"] = examples
  531. if regex is not None:
  532. warnings.warn(
  533. "`regex` has been depreacated, please use `pattern` instead",
  534. category=DeprecationWarning,
  535. stacklevel=4,
  536. )
  537. current_json_schema_extra = json_schema_extra or extra
  538. if PYDANTIC_V2:
  539. kwargs.update(
  540. {
  541. "annotation": annotation,
  542. "alias_priority": alias_priority,
  543. "validation_alias": validation_alias,
  544. "serialization_alias": serialization_alias,
  545. "strict": strict,
  546. "json_schema_extra": current_json_schema_extra,
  547. }
  548. )
  549. kwargs["pattern"] = pattern or regex
  550. else:
  551. kwargs["regex"] = pattern or regex
  552. kwargs.update(**current_json_schema_extra)
  553. use_kwargs = {k: v for k, v in kwargs.items() if v is not _Unset}
  554. super().__init__(**use_kwargs)
  555. def __repr__(self) -> str:
  556. return f"{self.__class__.__name__}({self.default})"
  557. class Form(Body):
  558. def __init__(
  559. self,
  560. default: Any = Undefined,
  561. *,
  562. default_factory: Union[Callable[[], Any], None] = _Unset,
  563. annotation: Optional[Any] = None,
  564. media_type: str = "application/x-www-form-urlencoded",
  565. alias: Optional[str] = None,
  566. alias_priority: Union[int, None] = _Unset,
  567. # TODO: update when deprecating Pydantic v1, import these types
  568. # validation_alias: str | AliasPath | AliasChoices | None
  569. validation_alias: Union[str, None] = None,
  570. serialization_alias: Union[str, None] = None,
  571. title: Optional[str] = None,
  572. description: Optional[str] = None,
  573. gt: Optional[float] = None,
  574. ge: Optional[float] = None,
  575. lt: Optional[float] = None,
  576. le: Optional[float] = None,
  577. min_length: Optional[int] = None,
  578. max_length: Optional[int] = None,
  579. pattern: Optional[str] = None,
  580. regex: Annotated[
  581. Optional[str],
  582. deprecated(
  583. "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead."
  584. ),
  585. ] = None,
  586. discriminator: Union[str, None] = None,
  587. strict: Union[bool, None] = _Unset,
  588. multiple_of: Union[float, None] = _Unset,
  589. allow_inf_nan: Union[bool, None] = _Unset,
  590. max_digits: Union[int, None] = _Unset,
  591. decimal_places: Union[int, None] = _Unset,
  592. examples: Optional[List[Any]] = None,
  593. example: Annotated[
  594. Optional[Any],
  595. deprecated(
  596. "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, "
  597. "although still supported. Use examples instead."
  598. ),
  599. ] = _Unset,
  600. openapi_examples: Optional[Dict[str, Example]] = None,
  601. deprecated: Optional[bool] = None,
  602. include_in_schema: bool = True,
  603. json_schema_extra: Union[Dict[str, Any], None] = None,
  604. **extra: Any,
  605. ):
  606. super().__init__(
  607. default=default,
  608. default_factory=default_factory,
  609. annotation=annotation,
  610. embed=True,
  611. media_type=media_type,
  612. alias=alias,
  613. alias_priority=alias_priority,
  614. validation_alias=validation_alias,
  615. serialization_alias=serialization_alias,
  616. title=title,
  617. description=description,
  618. gt=gt,
  619. ge=ge,
  620. lt=lt,
  621. le=le,
  622. min_length=min_length,
  623. max_length=max_length,
  624. pattern=pattern,
  625. regex=regex,
  626. discriminator=discriminator,
  627. strict=strict,
  628. multiple_of=multiple_of,
  629. allow_inf_nan=allow_inf_nan,
  630. max_digits=max_digits,
  631. decimal_places=decimal_places,
  632. deprecated=deprecated,
  633. example=example,
  634. examples=examples,
  635. openapi_examples=openapi_examples,
  636. include_in_schema=include_in_schema,
  637. json_schema_extra=json_schema_extra,
  638. **extra,
  639. )
  640. class File(Form):
  641. def __init__(
  642. self,
  643. default: Any = Undefined,
  644. *,
  645. default_factory: Union[Callable[[], Any], None] = _Unset,
  646. annotation: Optional[Any] = None,
  647. media_type: str = "multipart/form-data",
  648. alias: Optional[str] = None,
  649. alias_priority: Union[int, None] = _Unset,
  650. # TODO: update when deprecating Pydantic v1, import these types
  651. # validation_alias: str | AliasPath | AliasChoices | None
  652. validation_alias: Union[str, None] = None,
  653. serialization_alias: Union[str, None] = None,
  654. title: Optional[str] = None,
  655. description: Optional[str] = None,
  656. gt: Optional[float] = None,
  657. ge: Optional[float] = None,
  658. lt: Optional[float] = None,
  659. le: Optional[float] = None,
  660. min_length: Optional[int] = None,
  661. max_length: Optional[int] = None,
  662. pattern: Optional[str] = None,
  663. regex: Annotated[
  664. Optional[str],
  665. deprecated(
  666. "Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead."
  667. ),
  668. ] = None,
  669. discriminator: Union[str, None] = None,
  670. strict: Union[bool, None] = _Unset,
  671. multiple_of: Union[float, None] = _Unset,
  672. allow_inf_nan: Union[bool, None] = _Unset,
  673. max_digits: Union[int, None] = _Unset,
  674. decimal_places: Union[int, None] = _Unset,
  675. examples: Optional[List[Any]] = None,
  676. example: Annotated[
  677. Optional[Any],
  678. deprecated(
  679. "Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, "
  680. "although still supported. Use examples instead."
  681. ),
  682. ] = _Unset,
  683. openapi_examples: Optional[Dict[str, Example]] = None,
  684. deprecated: Optional[bool] = None,
  685. include_in_schema: bool = True,
  686. json_schema_extra: Union[Dict[str, Any], None] = None,
  687. **extra: Any,
  688. ):
  689. super().__init__(
  690. default=default,
  691. default_factory=default_factory,
  692. annotation=annotation,
  693. media_type=media_type,
  694. alias=alias,
  695. alias_priority=alias_priority,
  696. validation_alias=validation_alias,
  697. serialization_alias=serialization_alias,
  698. title=title,
  699. description=description,
  700. gt=gt,
  701. ge=ge,
  702. lt=lt,
  703. le=le,
  704. min_length=min_length,
  705. max_length=max_length,
  706. pattern=pattern,
  707. regex=regex,
  708. discriminator=discriminator,
  709. strict=strict,
  710. multiple_of=multiple_of,
  711. allow_inf_nan=allow_inf_nan,
  712. max_digits=max_digits,
  713. decimal_places=decimal_places,
  714. deprecated=deprecated,
  715. example=example,
  716. examples=examples,
  717. openapi_examples=openapi_examples,
  718. include_in_schema=include_in_schema,
  719. json_schema_extra=json_schema_extra,
  720. **extra,
  721. )
  722. class Depends:
  723. def __init__(
  724. self, dependency: Optional[Callable[..., Any]] = None, *, use_cache: bool = True
  725. ):
  726. self.dependency = dependency
  727. self.use_cache = use_cache
  728. def __repr__(self) -> str:
  729. attr = getattr(self.dependency, "__name__", type(self.dependency).__name__)
  730. cache = "" if self.use_cache else ", use_cache=False"
  731. return f"{self.__class__.__name__}({attr}{cache})"
  732. class Security(Depends):
  733. def __init__(
  734. self,
  735. dependency: Optional[Callable[..., Any]] = None,
  736. *,
  737. scopes: Optional[Sequence[str]] = None,
  738. use_cache: bool = True,
  739. ):
  740. super().__init__(dependency=dependency, use_cache=use_cache)
  741. self.scopes = scopes or []