Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 

769 rader
32 KiB

  1. from typing import Any, Callable, Coroutine, Dict, List, Optional, Sequence, Type, Union
  2. from fastapi import routing
  3. from fastapi.concurrency import AsyncExitStack
  4. from fastapi.datastructures import Default, DefaultPlaceholder
  5. from fastapi.encoders import DictIntStrAny, SetIntStr
  6. from fastapi.exception_handlers import (
  7. http_exception_handler,
  8. request_validation_exception_handler,
  9. )
  10. from fastapi.exceptions import RequestValidationError
  11. from fastapi.logger import logger
  12. from fastapi.openapi.docs import (
  13. get_redoc_html,
  14. get_swagger_ui_html,
  15. get_swagger_ui_oauth2_redirect_html,
  16. )
  17. from fastapi.openapi.utils import get_openapi
  18. from fastapi.params import Depends
  19. from fastapi.types import DecoratedCallable
  20. from starlette.applications import Starlette
  21. from starlette.datastructures import State
  22. from starlette.exceptions import HTTPException
  23. from starlette.middleware import Middleware
  24. from starlette.requests import Request
  25. from starlette.responses import HTMLResponse, JSONResponse, Response
  26. from starlette.routing import BaseRoute
  27. from starlette.types import ASGIApp, Receive, Scope, Send
  28. class FastAPI(Starlette):
  29. def __init__(
  30. self,
  31. *,
  32. debug: bool = False,
  33. routes: Optional[List[BaseRoute]] = None,
  34. title: str = "FastAPI",
  35. description: str = "",
  36. version: str = "0.1.0",
  37. openapi_url: Optional[str] = "/openapi.json",
  38. openapi_tags: Optional[List[Dict[str, Any]]] = None,
  39. servers: Optional[List[Dict[str, Union[str, Any]]]] = None,
  40. dependencies: Optional[Sequence[Depends]] = None,
  41. default_response_class: Type[Response] = Default(JSONResponse),
  42. docs_url: Optional[str] = "/docs",
  43. redoc_url: Optional[str] = "/redoc",
  44. swagger_ui_oauth2_redirect_url: Optional[str] = "/docs/oauth2-redirect",
  45. swagger_ui_init_oauth: Optional[Dict[str, Any]] = None,
  46. middleware: Optional[Sequence[Middleware]] = None,
  47. exception_handlers: Optional[
  48. Dict[
  49. Union[int, Type[Exception]],
  50. Callable[[Request, Any], Coroutine[Any, Any, Response]],
  51. ]
  52. ] = None,
  53. on_startup: Optional[Sequence[Callable[[], Any]]] = None,
  54. on_shutdown: Optional[Sequence[Callable[[], Any]]] = None,
  55. terms_of_service: Optional[str] = None,
  56. contact: Optional[Dict[str, Union[str, Any]]] = None,
  57. license_info: Optional[Dict[str, Union[str, Any]]] = None,
  58. openapi_prefix: str = "",
  59. root_path: str = "",
  60. root_path_in_servers: bool = True,
  61. responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
  62. callbacks: Optional[List[BaseRoute]] = None,
  63. deprecated: Optional[bool] = None,
  64. include_in_schema: bool = True,
  65. **extra: Any,
  66. ) -> None:
  67. self._debug: bool = debug
  68. self.state: State = State()
  69. self.router: routing.APIRouter = routing.APIRouter(
  70. routes=routes,
  71. dependency_overrides_provider=self,
  72. on_startup=on_startup,
  73. on_shutdown=on_shutdown,
  74. default_response_class=default_response_class,
  75. dependencies=dependencies,
  76. callbacks=callbacks,
  77. deprecated=deprecated,
  78. include_in_schema=include_in_schema,
  79. responses=responses,
  80. )
  81. self.exception_handlers: Dict[
  82. Union[int, Type[Exception]],
  83. Callable[[Request, Any], Coroutine[Any, Any, Response]],
  84. ] = (
  85. {} if exception_handlers is None else dict(exception_handlers)
  86. )
  87. self.exception_handlers.setdefault(HTTPException, http_exception_handler)
  88. self.exception_handlers.setdefault(
  89. RequestValidationError, request_validation_exception_handler
  90. )
  91. self.user_middleware: List[Middleware] = (
  92. [] if middleware is None else list(middleware)
  93. )
  94. self.middleware_stack: ASGIApp = self.build_middleware_stack()
  95. self.title = title
  96. self.description = description
  97. self.version = version
  98. self.terms_of_service = terms_of_service
  99. self.contact = contact
  100. self.license_info = license_info
  101. self.servers = servers or []
  102. self.openapi_url = openapi_url
  103. self.openapi_tags = openapi_tags
  104. # TODO: remove when discarding the openapi_prefix parameter
  105. if openapi_prefix:
  106. logger.warning(
  107. '"openapi_prefix" has been deprecated in favor of "root_path", which '
  108. "follows more closely the ASGI standard, is simpler, and more "
  109. "automatic. Check the docs at "
  110. "https://fastapi.tiangolo.com/advanced/sub-applications/"
  111. )
  112. self.root_path = root_path or openapi_prefix
  113. self.root_path_in_servers = root_path_in_servers
  114. self.docs_url = docs_url
  115. self.redoc_url = redoc_url
  116. self.swagger_ui_oauth2_redirect_url = swagger_ui_oauth2_redirect_url
  117. self.swagger_ui_init_oauth = swagger_ui_init_oauth
  118. self.extra = extra
  119. self.dependency_overrides: Dict[Callable[..., Any], Callable[..., Any]] = {}
  120. self.openapi_version = "3.0.2"
  121. if self.openapi_url:
  122. assert self.title, "A title must be provided for OpenAPI, e.g.: 'My API'"
  123. assert self.version, "A version must be provided for OpenAPI, e.g.: '2.1.0'"
  124. self.openapi_schema: Optional[Dict[str, Any]] = None
  125. self.setup()
  126. def openapi(self) -> Dict[str, Any]:
  127. if not self.openapi_schema:
  128. self.openapi_schema = get_openapi(
  129. title=self.title,
  130. version=self.version,
  131. openapi_version=self.openapi_version,
  132. description=self.description,
  133. terms_of_service=self.terms_of_service,
  134. contact=self.contact,
  135. license_info=self.license_info,
  136. routes=self.routes,
  137. tags=self.openapi_tags,
  138. servers=self.servers,
  139. )
  140. return self.openapi_schema
  141. def setup(self) -> None:
  142. if self.openapi_url:
  143. urls = (server_data.get("url") for server_data in self.servers)
  144. server_urls = {url for url in urls if url}
  145. async def openapi(req: Request) -> JSONResponse:
  146. root_path = req.scope.get("root_path", "").rstrip("/")
  147. if root_path not in server_urls:
  148. if root_path and self.root_path_in_servers:
  149. self.servers.insert(0, {"url": root_path})
  150. server_urls.add(root_path)
  151. return JSONResponse(self.openapi())
  152. self.add_route(self.openapi_url, openapi, include_in_schema=False)
  153. if self.openapi_url and self.docs_url:
  154. async def swagger_ui_html(req: Request) -> HTMLResponse:
  155. root_path = req.scope.get("root_path", "").rstrip("/")
  156. openapi_url = root_path + self.openapi_url
  157. oauth2_redirect_url = self.swagger_ui_oauth2_redirect_url
  158. if oauth2_redirect_url:
  159. oauth2_redirect_url = root_path + oauth2_redirect_url
  160. return get_swagger_ui_html(
  161. openapi_url=openapi_url,
  162. title=self.title + " - Swagger UI",
  163. oauth2_redirect_url=oauth2_redirect_url,
  164. init_oauth=self.swagger_ui_init_oauth,
  165. )
  166. self.add_route(self.docs_url, swagger_ui_html, include_in_schema=False)
  167. if self.swagger_ui_oauth2_redirect_url:
  168. async def swagger_ui_redirect(req: Request) -> HTMLResponse:
  169. return get_swagger_ui_oauth2_redirect_html()
  170. self.add_route(
  171. self.swagger_ui_oauth2_redirect_url,
  172. swagger_ui_redirect,
  173. include_in_schema=False,
  174. )
  175. if self.openapi_url and self.redoc_url:
  176. async def redoc_html(req: Request) -> HTMLResponse:
  177. root_path = req.scope.get("root_path", "").rstrip("/")
  178. openapi_url = root_path + self.openapi_url
  179. return get_redoc_html(
  180. openapi_url=openapi_url, title=self.title + " - ReDoc"
  181. )
  182. self.add_route(self.redoc_url, redoc_html, include_in_schema=False)
  183. async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
  184. if self.root_path:
  185. scope["root_path"] = self.root_path
  186. if AsyncExitStack:
  187. async with AsyncExitStack() as stack:
  188. scope["fastapi_astack"] = stack
  189. await super().__call__(scope, receive, send)
  190. else:
  191. await super().__call__(scope, receive, send) # pragma: no cover
  192. def add_api_route(
  193. self,
  194. path: str,
  195. endpoint: Callable[..., Coroutine[Any, Any, Response]],
  196. *,
  197. response_model: Optional[Type[Any]] = None,
  198. status_code: Optional[int] = None,
  199. tags: Optional[List[str]] = None,
  200. dependencies: Optional[Sequence[Depends]] = None,
  201. summary: Optional[str] = None,
  202. description: Optional[str] = None,
  203. response_description: str = "Successful Response",
  204. responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
  205. deprecated: Optional[bool] = None,
  206. methods: Optional[List[str]] = None,
  207. operation_id: Optional[str] = None,
  208. response_model_include: Optional[Union[SetIntStr, DictIntStrAny]] = None,
  209. response_model_exclude: Optional[Union[SetIntStr, DictIntStrAny]] = None,
  210. response_model_by_alias: bool = True,
  211. response_model_exclude_unset: bool = False,
  212. response_model_exclude_defaults: bool = False,
  213. response_model_exclude_none: bool = False,
  214. include_in_schema: bool = True,
  215. response_class: Union[Type[Response], DefaultPlaceholder] = Default(
  216. JSONResponse
  217. ),
  218. name: Optional[str] = None,
  219. openapi_extra: Optional[Dict[str, Any]] = None,
  220. ) -> None:
  221. self.router.add_api_route(
  222. path,
  223. endpoint=endpoint,
  224. response_model=response_model,
  225. status_code=status_code,
  226. tags=tags,
  227. dependencies=dependencies,
  228. summary=summary,
  229. description=description,
  230. response_description=response_description,
  231. responses=responses,
  232. deprecated=deprecated,
  233. methods=methods,
  234. operation_id=operation_id,
  235. response_model_include=response_model_include,
  236. response_model_exclude=response_model_exclude,
  237. response_model_by_alias=response_model_by_alias,
  238. response_model_exclude_unset=response_model_exclude_unset,
  239. response_model_exclude_defaults=response_model_exclude_defaults,
  240. response_model_exclude_none=response_model_exclude_none,
  241. include_in_schema=include_in_schema,
  242. response_class=response_class,
  243. name=name,
  244. openapi_extra=openapi_extra,
  245. )
  246. def api_route(
  247. self,
  248. path: str,
  249. *,
  250. response_model: Optional[Type[Any]] = None,
  251. status_code: Optional[int] = None,
  252. tags: Optional[List[str]] = None,
  253. dependencies: Optional[Sequence[Depends]] = None,
  254. summary: Optional[str] = None,
  255. description: Optional[str] = None,
  256. response_description: str = "Successful Response",
  257. responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
  258. deprecated: Optional[bool] = None,
  259. methods: Optional[List[str]] = None,
  260. operation_id: Optional[str] = None,
  261. response_model_include: Optional[Union[SetIntStr, DictIntStrAny]] = None,
  262. response_model_exclude: Optional[Union[SetIntStr, DictIntStrAny]] = None,
  263. response_model_by_alias: bool = True,
  264. response_model_exclude_unset: bool = False,
  265. response_model_exclude_defaults: bool = False,
  266. response_model_exclude_none: bool = False,
  267. include_in_schema: bool = True,
  268. response_class: Type[Response] = Default(JSONResponse),
  269. name: Optional[str] = None,
  270. openapi_extra: Optional[Dict[str, Any]] = None,
  271. ) -> Callable[[DecoratedCallable], DecoratedCallable]:
  272. def decorator(func: DecoratedCallable) -> DecoratedCallable:
  273. self.router.add_api_route(
  274. path,
  275. func,
  276. response_model=response_model,
  277. status_code=status_code,
  278. tags=tags,
  279. dependencies=dependencies,
  280. summary=summary,
  281. description=description,
  282. response_description=response_description,
  283. responses=responses,
  284. deprecated=deprecated,
  285. methods=methods,
  286. operation_id=operation_id,
  287. response_model_include=response_model_include,
  288. response_model_exclude=response_model_exclude,
  289. response_model_by_alias=response_model_by_alias,
  290. response_model_exclude_unset=response_model_exclude_unset,
  291. response_model_exclude_defaults=response_model_exclude_defaults,
  292. response_model_exclude_none=response_model_exclude_none,
  293. include_in_schema=include_in_schema,
  294. response_class=response_class,
  295. name=name,
  296. openapi_extra=openapi_extra,
  297. )
  298. return func
  299. return decorator
  300. def add_api_websocket_route(
  301. self, path: str, endpoint: Callable[..., Any], name: Optional[str] = None
  302. ) -> None:
  303. self.router.add_api_websocket_route(path, endpoint, name=name)
  304. def websocket(
  305. self, path: str, name: Optional[str] = None
  306. ) -> Callable[[DecoratedCallable], DecoratedCallable]:
  307. def decorator(func: DecoratedCallable) -> DecoratedCallable:
  308. self.add_api_websocket_route(path, func, name=name)
  309. return func
  310. return decorator
  311. def include_router(
  312. self,
  313. router: routing.APIRouter,
  314. *,
  315. prefix: str = "",
  316. tags: Optional[List[str]] = None,
  317. dependencies: Optional[Sequence[Depends]] = None,
  318. responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
  319. deprecated: Optional[bool] = None,
  320. include_in_schema: bool = True,
  321. default_response_class: Type[Response] = Default(JSONResponse),
  322. callbacks: Optional[List[BaseRoute]] = None,
  323. ) -> None:
  324. self.router.include_router(
  325. router,
  326. prefix=prefix,
  327. tags=tags,
  328. dependencies=dependencies,
  329. responses=responses,
  330. deprecated=deprecated,
  331. include_in_schema=include_in_schema,
  332. default_response_class=default_response_class,
  333. callbacks=callbacks,
  334. )
  335. def get(
  336. self,
  337. path: str,
  338. *,
  339. response_model: Optional[Type[Any]] = None,
  340. status_code: Optional[int] = None,
  341. tags: Optional[List[str]] = None,
  342. dependencies: Optional[Sequence[Depends]] = None,
  343. summary: Optional[str] = None,
  344. description: Optional[str] = None,
  345. response_description: str = "Successful Response",
  346. responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
  347. deprecated: Optional[bool] = None,
  348. operation_id: Optional[str] = None,
  349. response_model_include: Optional[Union[SetIntStr, DictIntStrAny]] = None,
  350. response_model_exclude: Optional[Union[SetIntStr, DictIntStrAny]] = None,
  351. response_model_by_alias: bool = True,
  352. response_model_exclude_unset: bool = False,
  353. response_model_exclude_defaults: bool = False,
  354. response_model_exclude_none: bool = False,
  355. include_in_schema: bool = True,
  356. response_class: Type[Response] = Default(JSONResponse),
  357. name: Optional[str] = None,
  358. callbacks: Optional[List[BaseRoute]] = None,
  359. openapi_extra: Optional[Dict[str, Any]] = None,
  360. ) -> Callable[[DecoratedCallable], DecoratedCallable]:
  361. return self.router.get(
  362. path,
  363. response_model=response_model,
  364. status_code=status_code,
  365. tags=tags,
  366. dependencies=dependencies,
  367. summary=summary,
  368. description=description,
  369. response_description=response_description,
  370. responses=responses,
  371. deprecated=deprecated,
  372. operation_id=operation_id,
  373. response_model_include=response_model_include,
  374. response_model_exclude=response_model_exclude,
  375. response_model_by_alias=response_model_by_alias,
  376. response_model_exclude_unset=response_model_exclude_unset,
  377. response_model_exclude_defaults=response_model_exclude_defaults,
  378. response_model_exclude_none=response_model_exclude_none,
  379. include_in_schema=include_in_schema,
  380. response_class=response_class,
  381. name=name,
  382. callbacks=callbacks,
  383. openapi_extra=openapi_extra,
  384. )
  385. def put(
  386. self,
  387. path: str,
  388. *,
  389. response_model: Optional[Type[Any]] = None,
  390. status_code: Optional[int] = None,
  391. tags: Optional[List[str]] = None,
  392. dependencies: Optional[Sequence[Depends]] = None,
  393. summary: Optional[str] = None,
  394. description: Optional[str] = None,
  395. response_description: str = "Successful Response",
  396. responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
  397. deprecated: Optional[bool] = None,
  398. operation_id: Optional[str] = None,
  399. response_model_include: Optional[Union[SetIntStr, DictIntStrAny]] = None,
  400. response_model_exclude: Optional[Union[SetIntStr, DictIntStrAny]] = None,
  401. response_model_by_alias: bool = True,
  402. response_model_exclude_unset: bool = False,
  403. response_model_exclude_defaults: bool = False,
  404. response_model_exclude_none: bool = False,
  405. include_in_schema: bool = True,
  406. response_class: Type[Response] = Default(JSONResponse),
  407. name: Optional[str] = None,
  408. callbacks: Optional[List[BaseRoute]] = None,
  409. openapi_extra: Optional[Dict[str, Any]] = None,
  410. ) -> Callable[[DecoratedCallable], DecoratedCallable]:
  411. return self.router.put(
  412. path,
  413. response_model=response_model,
  414. status_code=status_code,
  415. tags=tags,
  416. dependencies=dependencies,
  417. summary=summary,
  418. description=description,
  419. response_description=response_description,
  420. responses=responses,
  421. deprecated=deprecated,
  422. operation_id=operation_id,
  423. response_model_include=response_model_include,
  424. response_model_exclude=response_model_exclude,
  425. response_model_by_alias=response_model_by_alias,
  426. response_model_exclude_unset=response_model_exclude_unset,
  427. response_model_exclude_defaults=response_model_exclude_defaults,
  428. response_model_exclude_none=response_model_exclude_none,
  429. include_in_schema=include_in_schema,
  430. response_class=response_class,
  431. name=name,
  432. callbacks=callbacks,
  433. openapi_extra=openapi_extra,
  434. )
  435. def post(
  436. self,
  437. path: str,
  438. *,
  439. response_model: Optional[Type[Any]] = None,
  440. status_code: Optional[int] = None,
  441. tags: Optional[List[str]] = None,
  442. dependencies: Optional[Sequence[Depends]] = None,
  443. summary: Optional[str] = None,
  444. description: Optional[str] = None,
  445. response_description: str = "Successful Response",
  446. responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
  447. deprecated: Optional[bool] = None,
  448. operation_id: Optional[str] = None,
  449. response_model_include: Optional[Union[SetIntStr, DictIntStrAny]] = None,
  450. response_model_exclude: Optional[Union[SetIntStr, DictIntStrAny]] = None,
  451. response_model_by_alias: bool = True,
  452. response_model_exclude_unset: bool = False,
  453. response_model_exclude_defaults: bool = False,
  454. response_model_exclude_none: bool = False,
  455. include_in_schema: bool = True,
  456. response_class: Type[Response] = Default(JSONResponse),
  457. name: Optional[str] = None,
  458. callbacks: Optional[List[BaseRoute]] = None,
  459. openapi_extra: Optional[Dict[str, Any]] = None,
  460. ) -> Callable[[DecoratedCallable], DecoratedCallable]:
  461. return self.router.post(
  462. path,
  463. response_model=response_model,
  464. status_code=status_code,
  465. tags=tags,
  466. dependencies=dependencies,
  467. summary=summary,
  468. description=description,
  469. response_description=response_description,
  470. responses=responses,
  471. deprecated=deprecated,
  472. operation_id=operation_id,
  473. response_model_include=response_model_include,
  474. response_model_exclude=response_model_exclude,
  475. response_model_by_alias=response_model_by_alias,
  476. response_model_exclude_unset=response_model_exclude_unset,
  477. response_model_exclude_defaults=response_model_exclude_defaults,
  478. response_model_exclude_none=response_model_exclude_none,
  479. include_in_schema=include_in_schema,
  480. response_class=response_class,
  481. name=name,
  482. callbacks=callbacks,
  483. openapi_extra=openapi_extra,
  484. )
  485. def delete(
  486. self,
  487. path: str,
  488. *,
  489. response_model: Optional[Type[Any]] = None,
  490. status_code: Optional[int] = None,
  491. tags: Optional[List[str]] = None,
  492. dependencies: Optional[Sequence[Depends]] = None,
  493. summary: Optional[str] = None,
  494. description: Optional[str] = None,
  495. response_description: str = "Successful Response",
  496. responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
  497. deprecated: Optional[bool] = None,
  498. operation_id: Optional[str] = None,
  499. response_model_include: Optional[Union[SetIntStr, DictIntStrAny]] = None,
  500. response_model_exclude: Optional[Union[SetIntStr, DictIntStrAny]] = None,
  501. response_model_by_alias: bool = True,
  502. response_model_exclude_unset: bool = False,
  503. response_model_exclude_defaults: bool = False,
  504. response_model_exclude_none: bool = False,
  505. include_in_schema: bool = True,
  506. response_class: Type[Response] = Default(JSONResponse),
  507. name: Optional[str] = None,
  508. callbacks: Optional[List[BaseRoute]] = None,
  509. openapi_extra: Optional[Dict[str, Any]] = None,
  510. ) -> Callable[[DecoratedCallable], DecoratedCallable]:
  511. return self.router.delete(
  512. path,
  513. response_model=response_model,
  514. status_code=status_code,
  515. tags=tags,
  516. dependencies=dependencies,
  517. summary=summary,
  518. description=description,
  519. response_description=response_description,
  520. responses=responses,
  521. deprecated=deprecated,
  522. response_model_include=response_model_include,
  523. response_model_exclude=response_model_exclude,
  524. response_model_by_alias=response_model_by_alias,
  525. operation_id=operation_id,
  526. response_model_exclude_unset=response_model_exclude_unset,
  527. response_model_exclude_defaults=response_model_exclude_defaults,
  528. response_model_exclude_none=response_model_exclude_none,
  529. include_in_schema=include_in_schema,
  530. response_class=response_class,
  531. name=name,
  532. callbacks=callbacks,
  533. openapi_extra=openapi_extra,
  534. )
  535. def options(
  536. self,
  537. path: str,
  538. *,
  539. response_model: Optional[Type[Any]] = None,
  540. status_code: Optional[int] = None,
  541. tags: Optional[List[str]] = None,
  542. dependencies: Optional[Sequence[Depends]] = None,
  543. summary: Optional[str] = None,
  544. description: Optional[str] = None,
  545. response_description: str = "Successful Response",
  546. responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
  547. deprecated: Optional[bool] = None,
  548. operation_id: Optional[str] = None,
  549. response_model_include: Optional[Union[SetIntStr, DictIntStrAny]] = None,
  550. response_model_exclude: Optional[Union[SetIntStr, DictIntStrAny]] = None,
  551. response_model_by_alias: bool = True,
  552. response_model_exclude_unset: bool = False,
  553. response_model_exclude_defaults: bool = False,
  554. response_model_exclude_none: bool = False,
  555. include_in_schema: bool = True,
  556. response_class: Type[Response] = Default(JSONResponse),
  557. name: Optional[str] = None,
  558. callbacks: Optional[List[BaseRoute]] = None,
  559. openapi_extra: Optional[Dict[str, Any]] = None,
  560. ) -> Callable[[DecoratedCallable], DecoratedCallable]:
  561. return self.router.options(
  562. path,
  563. response_model=response_model,
  564. status_code=status_code,
  565. tags=tags,
  566. dependencies=dependencies,
  567. summary=summary,
  568. description=description,
  569. response_description=response_description,
  570. responses=responses,
  571. deprecated=deprecated,
  572. operation_id=operation_id,
  573. response_model_include=response_model_include,
  574. response_model_exclude=response_model_exclude,
  575. response_model_by_alias=response_model_by_alias,
  576. response_model_exclude_unset=response_model_exclude_unset,
  577. response_model_exclude_defaults=response_model_exclude_defaults,
  578. response_model_exclude_none=response_model_exclude_none,
  579. include_in_schema=include_in_schema,
  580. response_class=response_class,
  581. name=name,
  582. callbacks=callbacks,
  583. openapi_extra=openapi_extra,
  584. )
  585. def head(
  586. self,
  587. path: str,
  588. *,
  589. response_model: Optional[Type[Any]] = None,
  590. status_code: Optional[int] = None,
  591. tags: Optional[List[str]] = None,
  592. dependencies: Optional[Sequence[Depends]] = None,
  593. summary: Optional[str] = None,
  594. description: Optional[str] = None,
  595. response_description: str = "Successful Response",
  596. responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
  597. deprecated: Optional[bool] = None,
  598. operation_id: Optional[str] = None,
  599. response_model_include: Optional[Union[SetIntStr, DictIntStrAny]] = None,
  600. response_model_exclude: Optional[Union[SetIntStr, DictIntStrAny]] = None,
  601. response_model_by_alias: bool = True,
  602. response_model_exclude_unset: bool = False,
  603. response_model_exclude_defaults: bool = False,
  604. response_model_exclude_none: bool = False,
  605. include_in_schema: bool = True,
  606. response_class: Type[Response] = Default(JSONResponse),
  607. name: Optional[str] = None,
  608. callbacks: Optional[List[BaseRoute]] = None,
  609. openapi_extra: Optional[Dict[str, Any]] = None,
  610. ) -> Callable[[DecoratedCallable], DecoratedCallable]:
  611. return self.router.head(
  612. path,
  613. response_model=response_model,
  614. status_code=status_code,
  615. tags=tags,
  616. dependencies=dependencies,
  617. summary=summary,
  618. description=description,
  619. response_description=response_description,
  620. responses=responses,
  621. deprecated=deprecated,
  622. operation_id=operation_id,
  623. response_model_include=response_model_include,
  624. response_model_exclude=response_model_exclude,
  625. response_model_by_alias=response_model_by_alias,
  626. response_model_exclude_unset=response_model_exclude_unset,
  627. response_model_exclude_defaults=response_model_exclude_defaults,
  628. response_model_exclude_none=response_model_exclude_none,
  629. include_in_schema=include_in_schema,
  630. response_class=response_class,
  631. name=name,
  632. callbacks=callbacks,
  633. openapi_extra=openapi_extra,
  634. )
  635. def patch(
  636. self,
  637. path: str,
  638. *,
  639. response_model: Optional[Type[Any]] = None,
  640. status_code: Optional[int] = None,
  641. tags: Optional[List[str]] = None,
  642. dependencies: Optional[Sequence[Depends]] = None,
  643. summary: Optional[str] = None,
  644. description: Optional[str] = None,
  645. response_description: str = "Successful Response",
  646. responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
  647. deprecated: Optional[bool] = None,
  648. operation_id: Optional[str] = None,
  649. response_model_include: Optional[Union[SetIntStr, DictIntStrAny]] = None,
  650. response_model_exclude: Optional[Union[SetIntStr, DictIntStrAny]] = None,
  651. response_model_by_alias: bool = True,
  652. response_model_exclude_unset: bool = False,
  653. response_model_exclude_defaults: bool = False,
  654. response_model_exclude_none: bool = False,
  655. include_in_schema: bool = True,
  656. response_class: Type[Response] = Default(JSONResponse),
  657. name: Optional[str] = None,
  658. callbacks: Optional[List[BaseRoute]] = None,
  659. openapi_extra: Optional[Dict[str, Any]] = None,
  660. ) -> Callable[[DecoratedCallable], DecoratedCallable]:
  661. return self.router.patch(
  662. path,
  663. response_model=response_model,
  664. status_code=status_code,
  665. tags=tags,
  666. dependencies=dependencies,
  667. summary=summary,
  668. description=description,
  669. response_description=response_description,
  670. responses=responses,
  671. deprecated=deprecated,
  672. operation_id=operation_id,
  673. response_model_include=response_model_include,
  674. response_model_exclude=response_model_exclude,
  675. response_model_by_alias=response_model_by_alias,
  676. response_model_exclude_unset=response_model_exclude_unset,
  677. response_model_exclude_defaults=response_model_exclude_defaults,
  678. response_model_exclude_none=response_model_exclude_none,
  679. include_in_schema=include_in_schema,
  680. response_class=response_class,
  681. name=name,
  682. callbacks=callbacks,
  683. openapi_extra=openapi_extra,
  684. )
  685. def trace(
  686. self,
  687. path: str,
  688. *,
  689. response_model: Optional[Type[Any]] = None,
  690. status_code: Optional[int] = None,
  691. tags: Optional[List[str]] = None,
  692. dependencies: Optional[Sequence[Depends]] = None,
  693. summary: Optional[str] = None,
  694. description: Optional[str] = None,
  695. response_description: str = "Successful Response",
  696. responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
  697. deprecated: Optional[bool] = None,
  698. operation_id: Optional[str] = None,
  699. response_model_include: Optional[Union[SetIntStr, DictIntStrAny]] = None,
  700. response_model_exclude: Optional[Union[SetIntStr, DictIntStrAny]] = None,
  701. response_model_by_alias: bool = True,
  702. response_model_exclude_unset: bool = False,
  703. response_model_exclude_defaults: bool = False,
  704. response_model_exclude_none: bool = False,
  705. include_in_schema: bool = True,
  706. response_class: Type[Response] = Default(JSONResponse),
  707. name: Optional[str] = None,
  708. callbacks: Optional[List[BaseRoute]] = None,
  709. openapi_extra: Optional[Dict[str, Any]] = None,
  710. ) -> Callable[[DecoratedCallable], DecoratedCallable]:
  711. return self.router.trace(
  712. path,
  713. response_model=response_model,
  714. status_code=status_code,
  715. tags=tags,
  716. dependencies=dependencies,
  717. summary=summary,
  718. description=description,
  719. response_description=response_description,
  720. responses=responses,
  721. deprecated=deprecated,
  722. operation_id=operation_id,
  723. response_model_include=response_model_include,
  724. response_model_exclude=response_model_exclude,
  725. response_model_by_alias=response_model_by_alias,
  726. response_model_exclude_unset=response_model_exclude_unset,
  727. response_model_exclude_defaults=response_model_exclude_defaults,
  728. response_model_exclude_none=response_model_exclude_none,
  729. include_in_schema=include_in_schema,
  730. response_class=response_class,
  731. name=name,
  732. callbacks=callbacks,
  733. openapi_extra=openapi_extra,
  734. )