Ejemplo n.º 1
0
 def include_router(
     self,
     router: "APIRouter",
     *,
     prefix: str = "",
     tags: Optional[List[str]] = None,
     dependencies: Optional[Sequence[params.Depends]] = None,
     default_response_class: Type[Response] = Default(JSONResponse),
     responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
     callbacks: Optional[List[APIRoute]] = None,
     deprecated: bool = None,
     include_in_schema: bool = True,
 ) -> None:
     if prefix:
         assert prefix.startswith("/"), "A path prefix must start with '/'"
         assert not prefix.endswith(
             "/"
         ), "A path prefix must not end with '/', as the routes will start with '/'"
     else:
         for r in router.routes:
             path = getattr(r, "path")
             name = getattr(r, "name", "unknown")
             if path is not None and not path:
                 raise Exception(
                     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)
             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,
             )
         elif isinstance(route, routing.Route):
             self.add_route(
                 prefix + route.path,
                 route.endpoint,
                 methods=list(route.methods or []),
                 include_in_schema=route.include_in_schema,
                 name=route.name,
             )
         elif isinstance(route, APIWebSocketRoute):
             self.add_api_websocket_route(
                 prefix + route.path, route.endpoint, 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)
Ejemplo n.º 2
0
 def add_api_route(
     self,
     path: str,
     endpoint: Callable,
     *,
     response_model: Optional[Type[Any]] = None,
     status_code: int = 200,
     tags: Optional[List[str]] = None,
     dependencies: Optional[Sequence[params.Depends]] = None,
     summary: Optional[str] = None,
     description: Optional[str] = None,
     response_description: str = "Successful Response",
     responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
     deprecated: Optional[bool] = None,
     methods: Optional[Union[Set[str], List[str]]] = None,
     operation_id: Optional[str] = None,
     response_model_include: Optional[Union[SetIntStr, DictIntStrAny]] = None,
     response_model_exclude: Optional[Union[SetIntStr, DictIntStrAny]] = None,
     response_model_by_alias: bool = True,
     response_model_exclude_unset: bool = False,
     response_model_exclude_defaults: bool = False,
     response_model_exclude_none: bool = False,
     include_in_schema: bool = True,
     response_class: Union[Type[Response], DefaultPlaceholder] = Default(
         JSONResponse
     ),
     name: Optional[str] = None,
     route_class_override: Optional[Type[APIRoute]] = None,
     callbacks: Optional[List[APIRoute]] = None,
 ) -> 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)
     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,
     )
     self.routes.append(route)