Exemplo n.º 1
0
 def state(self) -> State:
     if not hasattr(self, "_state"):
         # Ensure 'state' has an empty dict if it's not already populated.
         self.scope.setdefault("state", {})
         # Create a state instance with a reference to the dict in which it should store info
         self._state = State(self.scope["state"])
     return self._state
Exemplo n.º 2
0
    def __init__(
        self,
        debug: bool = False,
        routes: typing.Sequence[BaseRoute] = None,
        middleware: typing.Sequence[Middleware] = None,
        exception_handlers: typing.Dict[typing.Union[int,
                                                     typing.Type[Exception]],
                                        typing.Callable] = None,
        on_startup: typing.Sequence[typing.Callable] = None,
        on_shutdown: typing.Sequence[typing.Callable] = None,
        lifespan: typing.Callable[["Starlette"], typing.AsyncGenerator] = None,
    ) -> None:
        # The lifespan context function is a newer style that replaces
        # on_startup / on_shutdown handlers. Use one or the other, not both.
        assert lifespan is None or (
            on_startup is None and on_shutdown is None
        ), "Use either 'lifespan' or 'on_startup'/'on_shutdown', not both."

        self._debug = debug
        self.state = State()
        self.router = Router(routes,
                             on_startup=on_startup,
                             on_shutdown=on_shutdown,
                             lifespan=lifespan)
        self.exception_handlers = ({} if exception_handlers is None else
                                   dict(exception_handlers))
        self.user_middleware = [] if middleware is None else list(middleware)
        self.middleware_stack = self.build_middleware_stack()
Exemplo n.º 3
0
    def __init__(
        self,
        *,
        debug: bool = False,
        routes: List[BaseRoute] = None,
        title: str = "FastAPI",
        description: str = "",
        version: str = "0.1.0",
        openapi_url: Optional[str] = "/openapi.json",
        openapi_prefix: str = "",
        default_response_class: Type[Response] = JSONResponse,
        docs_url: Optional[str] = "/docs",
        redoc_url: Optional[str] = "/redoc",
        swagger_ui_oauth2_redirect_url: Optional[
            str] = "/docs/oauth2-redirect",
        swagger_ui_init_oauth: Optional[dict] = None,
        middleware: Sequence[Middleware] = None,
        exception_handlers: Dict[Union[int, Type[Exception]], Callable] = None,
        on_startup: Sequence[Callable] = None,
        on_shutdown: Sequence[Callable] = None,
        **extra: Dict[str, Any],
    ) -> None:
        self.default_response_class = default_response_class
        self._debug = debug
        self.state = State()
        self.router: routing.APIRouter = routing.APIRouter(
            routes,
            dependency_overrides_provider=self,
            on_startup=on_startup,
            on_shutdown=on_shutdown,
        )
        self.exception_handlers = ({} if exception_handlers is None else
                                   dict(exception_handlers))

        self.user_middleware = [] if middleware is None else list(middleware)
        self.middleware_stack = self.build_middleware_stack()

        self.title = title
        self.description = description
        self.version = version
        self.openapi_url = openapi_url
        self.openapi_prefix = openapi_prefix.rstrip("/")
        self.docs_url = docs_url
        self.redoc_url = redoc_url
        self.swagger_ui_oauth2_redirect_url = swagger_ui_oauth2_redirect_url
        self.swagger_ui_init_oauth = swagger_ui_init_oauth
        self.extra = extra
        self.dependency_overrides: Dict[Callable, Callable] = {}

        self.openapi_version = "3.0.2"

        if self.openapi_url:
            assert self.title, "A title must be provided for OpenAPI, e.g.: 'My API'"
            assert self.version, "A version must be provided for OpenAPI, e.g.: '2.1.0'"

        if self.docs_url or self.redoc_url:
            assert self.openapi_url, "The openapi_url is required for the docs"
        self.openapi_schema: Optional[Dict[str, Any]] = None
        self.setup()
Exemplo n.º 4
0
def test_payload_auth_backend_missing_session_error(mocker, loop):
    backend = auth.PayloadAuthBackend(user_cls=User)

    mock_conn = mocker.Mock(state=State({"payload": {"username": "******"}}))
    with pytest.raises(RuntimeError) as exc_info:
        loop.run_until_complete(backend.authenticate(mock_conn))

    error_msg = "Missing 'request.state.session': " \
                "try adding 'middleware.SessionMiddleware'"
    assert str(exc_info.value) == error_msg
Exemplo n.º 5
0
 def __init__(self,
              debug: bool = False,
              routes: typing.List[BaseRoute] = None) -> None:
     self._debug = debug
     self.state = State()
     self.router = Router(routes)
     self.exception_middleware = ExceptionMiddleware(self.router,
                                                     debug=debug)
     self.error_middleware = ServerErrorMiddleware(
         self.exception_middleware, debug=debug)
Exemplo n.º 6
0
def test_payload_auth_backend_missing_payload_error(mocker, loop):
    backend = auth.PayloadAuthBackend()

    mock_conn = mocker.Mock(state=State())
    with pytest.raises(RuntimeError) as exc_info:
        loop.run_until_complete(backend.authenticate(mock_conn))

    error_msg = "Missing 'request.state.payload': " \
                "try adding 'middleware.UpstreamPayloadMiddleware'"
    assert str(exc_info.value) == error_msg
Exemplo n.º 7
0
    def __init__(
        self,
        debug: bool = False,
        routes: List[BaseRoute] = None,
        template_directory: str = None,
        title: str = "Fast API",
        description: str = "",
        version: str = "0.1.0",
        openapi_url: Optional[str] = "/openapi.json",
        openapi_prefix: str = "",
        default_response_class: Type[Response] = JSONResponse,
        docs_url: Optional[str] = "/docs",
        redoc_url: Optional[str] = "/redoc",
        swagger_ui_oauth2_redirect_url: Optional[
            str] = "/docs/oauth2-redirect",
        swagger_ui_init_oauth: Optional[dict] = None,
        **extra: Dict[str, Any],
    ) -> None:
        self.default_response_class = default_response_class
        self._debug = debug
        self.state = State()
        self.router: routing.APIRouter = routing.APIRouter(
            routes, dependency_overrides_provider=self)
        self.exception_middleware = ExceptionMiddleware(self.router,
                                                        debug=debug)
        self.error_middleware = ServerErrorMiddleware(
            self.exception_middleware, debug=debug)

        self.title = title
        self.description = description
        self.version = version
        self.openapi_url = openapi_url
        self.openapi_prefix = openapi_prefix.rstrip("/")
        self.docs_url = docs_url
        self.redoc_url = redoc_url
        self.swagger_ui_oauth2_redirect_url = swagger_ui_oauth2_redirect_url
        self.swagger_ui_init_oauth = swagger_ui_init_oauth
        self.extra = extra
        self.dependency_overrides: Dict[Callable, Callable] = {}

        self.openapi_version = "3.0.2"

        if self.openapi_url:
            assert self.title, "A title must be provided for OpenAPI, e.g.: 'My API'"
            assert self.version, "A version must be provided for OpenAPI, e.g.: '2.1.0'"

        if self.docs_url or self.redoc_url:
            assert self.openapi_url, "The openapi_url is required for the docs"
        self.openapi_schema: Optional[Dict[str, Any]] = None
        self.setup()
Exemplo n.º 8
0
def test_payload_auth_backend_no_user_cls(mocker, loop):
    expected_username = "******"

    backend = auth.PayloadAuthBackend()

    mock_conn = mocker.Mock(
        state=State({"payload": {
            "username": expected_username
        }}))
    result = loop.run_until_complete(backend.authenticate(mock_conn))
    assert result is not None
    assert len(result) == 2
    assert isinstance(result[1], SimpleUser)
    assert result[1].username == expected_username
Exemplo n.º 9
0
 def __init__(
     self,
     debug: bool = False,
     routes: typing.List[BaseRoute] = None,
     middleware: typing.List[typing.Optional[Middleware]] = None,
     exception_handlers: typing.Dict[
         typing.Union[int, typing.Type[Exception]], typing.Callable
     ] = None,
     on_startup: typing.List[typing.Callable] = None,
     on_shutdown: typing.List[typing.Callable] = None,
 ) -> None:
     self._debug = debug
     self.state = State()
     self.router = Router(routes, on_startup=on_startup, on_shutdown=on_shutdown)
     self.exception_handlers = (
         {} if exception_handlers is None else dict(exception_handlers)
     )
     self.user_middleware = [item for item in middleware or [] if item is not None]
     self.middleware_stack = self.build_middleware_stack()
Exemplo n.º 10
0
 def __init__(
     self,
     debug: bool = False,
     routes: typing.Sequence[BaseRoute] = None,
     middleware: typing.Sequence[Middleware] = None,
     exception_handlers: typing.Dict[
         typing.Union[int, typing.Type[Exception]], typing.Callable
     ] = None,
     on_startup: typing.Sequence[typing.Callable] = None,
     on_shutdown: typing.Sequence[typing.Callable] = None,
 ) -> None:
     self._debug = debug
     self.state = State()
     self.router = Router(routes, on_startup=on_startup, on_shutdown=on_shutdown)
     self.exception_handlers = (
         {} if exception_handlers is None else dict(exception_handlers)
     )
     self.user_middleware = [] if middleware is None else list(middleware)
     self.middleware_stack = self.build_middleware_stack()
Exemplo n.º 11
0
    def __init__(
        self,
        *,
        debug: bool = False,
        routes: Optional[List[BaseRoute]] = None,
        title: str = "FastAPI",
        description: str = "",
        version: str = "0.1.0",
        openapi_url: Optional[str] = "/openapi.json",
        openapi_tags: Optional[List[Dict[str, Any]]] = None,
        servers: Optional[List[Dict[str, Union[str, Any]]]] = None,
        default_response_class: Type[Response] = JSONResponse,
        docs_url: Optional[str] = "/docs",
        redoc_url: Optional[str] = "/redoc",
        swagger_ui_oauth2_redirect_url: Optional[
            str] = "/docs/oauth2-redirect",
        swagger_ui_init_oauth: Optional[dict] = None,
        middleware: Optional[Sequence[Middleware]] = None,
        exception_handlers: Optional[Dict[Union[int, Type[Exception]],
                                          Callable]] = None,
        on_startup: Optional[Sequence[Callable]] = None,
        on_shutdown: Optional[Sequence[Callable]] = None,
        openapi_prefix: str = "",
        root_path: str = "",
        root_path_in_servers: bool = True,
        **extra: Any,
    ) -> None:
        self.default_response_class = default_response_class
        self._debug = debug
        self.state = State()
        self.router: routing.APIRouter = routing.APIRouter(
            routes,
            dependency_overrides_provider=self,
            on_startup=on_startup,
            on_shutdown=on_shutdown,
        )
        self.exception_handlers = ({} if exception_handlers is None else
                                   dict(exception_handlers))

        self.user_middleware = [] if middleware is None else list(middleware)
        self.middleware_stack = self.build_middleware_stack()

        self.title = title
        self.description = description
        self.version = version
        self.servers = servers or []
        self.openapi_url = openapi_url
        self.openapi_tags = openapi_tags
        # TODO: remove when discarding the openapi_prefix parameter
        if openapi_prefix:
            logger.warning(
                '"openapi_prefix" has been deprecated in favor of "root_path", which '
                "follows more closely the ASGI standard, is simpler, and more "
                "automatic. Check the docs at "
                "https://fastapi.tiangolo.com/advanced/sub-applications/")
        self.root_path = root_path or openapi_prefix
        self.root_path_in_servers = root_path_in_servers
        self.docs_url = docs_url
        self.redoc_url = redoc_url
        self.swagger_ui_oauth2_redirect_url = swagger_ui_oauth2_redirect_url
        self.swagger_ui_init_oauth = swagger_ui_init_oauth
        self.extra = extra
        self.dependency_overrides: Dict[Callable, Callable] = {}

        self.openapi_version = "3.0.2"

        if self.openapi_url:
            assert self.title, "A title must be provided for OpenAPI, e.g.: 'My API'"
            assert self.version, "A version must be provided for OpenAPI, e.g.: '2.1.0'"
        self.openapi_schema: Optional[Dict[str, Any]] = None
        self.setup()
Exemplo n.º 12
0
def context(db_session: Session) -> Dict[str, Any]:
    state = State({"db_session": db_session})
    return {"request": FakeRequest(state=state)}
Exemplo n.º 13
0
    def __init__(
        self,
        *,
        debug: bool = False,
        routes: Optional[List[BaseRoute]] = None,
        title: str = "FastAPI",
        description: str = "",
        version: str = "0.1.0",
        openapi_url: Optional[str] = "/openapi.json",
        openapi_tags: Optional[List[Dict[str, Any]]] = None,
        servers: Optional[List[Dict[str, Union[str, Any]]]] = None,
        dependencies: Optional[Sequence[Depends]] = None,
        default_response_class: Type[Response] = Default(JSONResponse),
        docs_url: Optional[str] = "/docs",
        redoc_url: Optional[str] = "/redoc",
        swagger_ui_oauth2_redirect_url: Optional[
            str] = "/docs/oauth2-redirect",
        swagger_ui_init_oauth: Optional[Dict[str, Any]] = None,
        middleware: Optional[Sequence[Middleware]] = None,
        exception_handlers: Optional[Dict[Union[int, Type[Exception]],
                                          Callable[[Request, Any], Coroutine[
                                              Any, Any, Response]], ]] = None,
        on_startup: Optional[Sequence[Callable[[], Any]]] = None,
        on_shutdown: Optional[Sequence[Callable[[], Any]]] = None,
        terms_of_service: Optional[str] = None,
        contact: Optional[Dict[str, Union[str, Any]]] = None,
        license_info: Optional[Dict[str, Union[str, Any]]] = None,
        openapi_prefix: str = "",
        root_path: str = "",
        root_path_in_servers: bool = True,
        responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
        callbacks: Optional[List[BaseRoute]] = None,
        deprecated: Optional[bool] = None,
        include_in_schema: bool = True,
        swagger_ui_parameters: Optional[Dict[str, Any]] = None,
        generate_unique_id_function: Callable[
            [routing.APIRoute], str] = Default(generate_unique_id),
        **extra: Any,
    ) -> None:
        self._debug: bool = debug
        self.title = title
        self.description = description
        self.version = version
        self.terms_of_service = terms_of_service
        self.contact = contact
        self.license_info = license_info
        self.openapi_url = openapi_url
        self.openapi_tags = openapi_tags
        self.root_path_in_servers = root_path_in_servers
        self.docs_url = docs_url
        self.redoc_url = redoc_url
        self.swagger_ui_oauth2_redirect_url = swagger_ui_oauth2_redirect_url
        self.swagger_ui_init_oauth = swagger_ui_init_oauth
        self.swagger_ui_parameters = swagger_ui_parameters
        self.servers = servers or []
        self.extra = extra
        self.openapi_version = "3.0.2"
        self.openapi_schema: Optional[Dict[str, Any]] = None
        if self.openapi_url:
            assert self.title, "A title must be provided for OpenAPI, e.g.: 'My API'"
            assert self.version, "A version must be provided for OpenAPI, e.g.: '2.1.0'"
        # TODO: remove when discarding the openapi_prefix parameter
        if openapi_prefix:
            logger.warning(
                '"openapi_prefix" has been deprecated in favor of "root_path", which '
                "follows more closely the ASGI standard, is simpler, and more "
                "automatic. Check the docs at "
                "https://fastapi.tiangolo.com/advanced/sub-applications/")
        self.root_path = root_path or openapi_prefix
        self.state: State = State()
        self.dependency_overrides: Dict[Callable[..., Any],
                                        Callable[..., Any]] = {}
        self.router: routing.APIRouter = routing.APIRouter(
            routes=routes,
            dependency_overrides_provider=self,
            on_startup=on_startup,
            on_shutdown=on_shutdown,
            default_response_class=default_response_class,
            dependencies=dependencies,
            callbacks=callbacks,
            deprecated=deprecated,
            include_in_schema=include_in_schema,
            responses=responses,
            generate_unique_id_function=generate_unique_id_function,
        )
        self.exception_handlers: Dict[Any, Callable[[Request, Any], Union[
            Response,
            Awaitable[Response]]]] = ({} if exception_handlers is None else
                                      dict(exception_handlers))
        self.exception_handlers.setdefault(HTTPException,
                                           http_exception_handler)
        self.exception_handlers.setdefault(
            RequestValidationError, request_validation_exception_handler)

        self.user_middleware: List[Middleware] = ([] if middleware is None else
                                                  list(middleware))
        self.middleware_stack: ASGIApp = self.build_middleware_stack()
        self.setup()