summaryrefslogtreecommitdiff
path: root/venv/lib/python3.11/site-packages/litestar/handlers
diff options
context:
space:
mode:
authorcyfraeviolae <cyfraeviolae>2024-04-03 03:17:55 -0400
committercyfraeviolae <cyfraeviolae>2024-04-03 03:17:55 -0400
commit12cf076118570eebbff08c6b3090e0d4798447a1 (patch)
tree3ba25e17e3c3a5e82316558ba3864b955919ff72 /venv/lib/python3.11/site-packages/litestar/handlers
parentc45662ff3923b34614ddcc8feb9195541166dcc5 (diff)
no venv
Diffstat (limited to 'venv/lib/python3.11/site-packages/litestar/handlers')
-rw-r--r--venv/lib/python3.11/site-packages/litestar/handlers/__init__.py29
-rw-r--r--venv/lib/python3.11/site-packages/litestar/handlers/__pycache__/__init__.cpython-311.pycbin919 -> 0 bytes
-rw-r--r--venv/lib/python3.11/site-packages/litestar/handlers/__pycache__/asgi_handlers.cpython-311.pycbin5223 -> 0 bytes
-rw-r--r--venv/lib/python3.11/site-packages/litestar/handlers/__pycache__/base.cpython-311.pycbin30837 -> 0 bytes
-rw-r--r--venv/lib/python3.11/site-packages/litestar/handlers/asgi_handlers.py90
-rw-r--r--venv/lib/python3.11/site-packages/litestar/handlers/base.py577
-rw-r--r--venv/lib/python3.11/site-packages/litestar/handlers/http_handlers/__init__.py15
-rw-r--r--venv/lib/python3.11/site-packages/litestar/handlers/http_handlers/__pycache__/__init__.cpython-311.pycbin584 -> 0 bytes
-rw-r--r--venv/lib/python3.11/site-packages/litestar/handlers/http_handlers/__pycache__/_utils.cpython-311.pycbin9051 -> 0 bytes
-rw-r--r--venv/lib/python3.11/site-packages/litestar/handlers/http_handlers/__pycache__/base.cpython-311.pycbin32501 -> 0 bytes
-rw-r--r--venv/lib/python3.11/site-packages/litestar/handlers/http_handlers/__pycache__/decorators.cpython-311.pycbin58348 -> 0 bytes
-rw-r--r--venv/lib/python3.11/site-packages/litestar/handlers/http_handlers/_utils.py221
-rw-r--r--venv/lib/python3.11/site-packages/litestar/handlers/http_handlers/base.py591
-rw-r--r--venv/lib/python3.11/site-packages/litestar/handlers/http_handlers/decorators.py1096
-rw-r--r--venv/lib/python3.11/site-packages/litestar/handlers/websocket_handlers/__init__.py16
-rw-r--r--venv/lib/python3.11/site-packages/litestar/handlers/websocket_handlers/__pycache__/__init__.cpython-311.pycbin670 -> 0 bytes
-rw-r--r--venv/lib/python3.11/site-packages/litestar/handlers/websocket_handlers/__pycache__/_utils.cpython-311.pycbin10594 -> 0 bytes
-rw-r--r--venv/lib/python3.11/site-packages/litestar/handlers/websocket_handlers/__pycache__/listener.cpython-311.pycbin18940 -> 0 bytes
-rw-r--r--venv/lib/python3.11/site-packages/litestar/handlers/websocket_handlers/__pycache__/route_handler.cpython-311.pycbin6002 -> 0 bytes
-rw-r--r--venv/lib/python3.11/site-packages/litestar/handlers/websocket_handlers/_utils.py154
-rw-r--r--venv/lib/python3.11/site-packages/litestar/handlers/websocket_handlers/listener.py417
-rw-r--r--venv/lib/python3.11/site-packages/litestar/handlers/websocket_handlers/route_handler.py99
22 files changed, 0 insertions, 3305 deletions
diff --git a/venv/lib/python3.11/site-packages/litestar/handlers/__init__.py b/venv/lib/python3.11/site-packages/litestar/handlers/__init__.py
deleted file mode 100644
index 822fe7e..0000000
--- a/venv/lib/python3.11/site-packages/litestar/handlers/__init__.py
+++ /dev/null
@@ -1,29 +0,0 @@
-from .asgi_handlers import ASGIRouteHandler, asgi
-from .base import BaseRouteHandler
-from .http_handlers import HTTPRouteHandler, delete, get, head, patch, post, put, route
-from .websocket_handlers import (
- WebsocketListener,
- WebsocketListenerRouteHandler,
- WebsocketRouteHandler,
- websocket,
- websocket_listener,
-)
-
-__all__ = (
- "ASGIRouteHandler",
- "BaseRouteHandler",
- "HTTPRouteHandler",
- "WebsocketListener",
- "WebsocketRouteHandler",
- "WebsocketListenerRouteHandler",
- "asgi",
- "delete",
- "get",
- "head",
- "patch",
- "post",
- "put",
- "route",
- "websocket",
- "websocket_listener",
-)
diff --git a/venv/lib/python3.11/site-packages/litestar/handlers/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/litestar/handlers/__pycache__/__init__.cpython-311.pyc
deleted file mode 100644
index 6976d76..0000000
--- a/venv/lib/python3.11/site-packages/litestar/handlers/__pycache__/__init__.cpython-311.pyc
+++ /dev/null
Binary files differ
diff --git a/venv/lib/python3.11/site-packages/litestar/handlers/__pycache__/asgi_handlers.cpython-311.pyc b/venv/lib/python3.11/site-packages/litestar/handlers/__pycache__/asgi_handlers.cpython-311.pyc
deleted file mode 100644
index 85de8f8..0000000
--- a/venv/lib/python3.11/site-packages/litestar/handlers/__pycache__/asgi_handlers.cpython-311.pyc
+++ /dev/null
Binary files differ
diff --git a/venv/lib/python3.11/site-packages/litestar/handlers/__pycache__/base.cpython-311.pyc b/venv/lib/python3.11/site-packages/litestar/handlers/__pycache__/base.cpython-311.pyc
deleted file mode 100644
index 2331fc7..0000000
--- a/venv/lib/python3.11/site-packages/litestar/handlers/__pycache__/base.cpython-311.pyc
+++ /dev/null
Binary files differ
diff --git a/venv/lib/python3.11/site-packages/litestar/handlers/asgi_handlers.py b/venv/lib/python3.11/site-packages/litestar/handlers/asgi_handlers.py
deleted file mode 100644
index 91f3517..0000000
--- a/venv/lib/python3.11/site-packages/litestar/handlers/asgi_handlers.py
+++ /dev/null
@@ -1,90 +0,0 @@
-from __future__ import annotations
-
-from typing import TYPE_CHECKING, Any, Mapping, Sequence
-
-from litestar.exceptions import ImproperlyConfiguredException
-from litestar.handlers.base import BaseRouteHandler
-from litestar.types.builtin_types import NoneType
-from litestar.utils.predicates import is_async_callable
-
-__all__ = ("ASGIRouteHandler", "asgi")
-
-
-if TYPE_CHECKING:
- from litestar.types import (
- ExceptionHandlersMap,
- Guard,
- MaybePartial, # noqa: F401
- )
-
-
-class ASGIRouteHandler(BaseRouteHandler):
- """ASGI Route Handler decorator.
-
- Use this decorator to decorate ASGI applications.
- """
-
- __slots__ = ("is_mount", "is_static")
-
- def __init__(
- self,
- path: str | Sequence[str] | None = None,
- *,
- exception_handlers: ExceptionHandlersMap | None = None,
- guards: Sequence[Guard] | None = None,
- name: str | None = None,
- opt: Mapping[str, Any] | None = None,
- is_mount: bool = False,
- is_static: bool = False,
- signature_namespace: Mapping[str, Any] | None = None,
- **kwargs: Any,
- ) -> None:
- """Initialize ``ASGIRouteHandler``.
-
- Args:
- exception_handlers: A mapping of status codes and/or exception types to handler functions.
- guards: A sequence of :class:`Guard <.types.Guard>` callables.
- name: A string identifying the route handler.
- opt: A string key mapping of arbitrary values that can be accessed in :class:`Guards <.types.Guard>` or
- wherever you have access to :class:`Request <.connection.Request>` or
- :class:`ASGI Scope <.types.Scope>`.
- path: A path fragment for the route handler function or a list of path fragments. If not given defaults to
- ``/``
- is_mount: A boolean dictating whether the handler's paths should be regarded as mount paths. Mount path
- accept any arbitrary paths that begin with the defined prefixed path. For example, a mount with the path
- ``/some-path/`` will accept requests for ``/some-path/`` and any sub path under this, e.g.
- ``/some-path/sub-path/`` etc.
- is_static: A boolean dictating whether the handler's paths should be regarded as static paths. Static paths
- are used to deliver static files.
- signature_namespace: A mapping of names to types for use in forward reference resolution during signature modelling.
- type_encoders: A mapping of types to callables that transform them into types supported for serialization.
- **kwargs: Any additional kwarg - will be set in the opt dictionary.
- """
- self.is_mount = is_mount or is_static
- self.is_static = is_static
- super().__init__(
- path,
- exception_handlers=exception_handlers,
- guards=guards,
- name=name,
- opt=opt,
- signature_namespace=signature_namespace,
- **kwargs,
- )
-
- def _validate_handler_function(self) -> None:
- """Validate the route handler function once it's set by inspecting its return annotations."""
- super()._validate_handler_function()
-
- if not self.parsed_fn_signature.return_type.is_subclass_of(NoneType):
- raise ImproperlyConfiguredException("ASGI handler functions should return 'None'")
-
- if any(key not in self.parsed_fn_signature.parameters for key in ("scope", "send", "receive")):
- raise ImproperlyConfiguredException(
- "ASGI handler functions should define 'scope', 'send' and 'receive' arguments"
- )
- if not is_async_callable(self.fn):
- raise ImproperlyConfiguredException("Functions decorated with 'asgi' must be async functions")
-
-
-asgi = ASGIRouteHandler
diff --git a/venv/lib/python3.11/site-packages/litestar/handlers/base.py b/venv/lib/python3.11/site-packages/litestar/handlers/base.py
deleted file mode 100644
index 9dbb70e..0000000
--- a/venv/lib/python3.11/site-packages/litestar/handlers/base.py
+++ /dev/null
@@ -1,577 +0,0 @@
-from __future__ import annotations
-
-from copy import copy
-from functools import partial
-from typing import TYPE_CHECKING, Any, Callable, Mapping, Sequence, cast
-
-from litestar._signature import SignatureModel
-from litestar.config.app import ExperimentalFeatures
-from litestar.di import Provide
-from litestar.dto import DTOData
-from litestar.exceptions import ImproperlyConfiguredException
-from litestar.plugins import DIPlugin, PluginRegistry
-from litestar.serialization import default_deserializer, default_serializer
-from litestar.types import (
- Dependencies,
- Empty,
- ExceptionHandlersMap,
- Guard,
- Middleware,
- TypeDecodersSequence,
- TypeEncodersMap,
-)
-from litestar.typing import FieldDefinition
-from litestar.utils import ensure_async_callable, get_name, normalize_path
-from litestar.utils.helpers import unwrap_partial
-from litestar.utils.signature import ParsedSignature, add_types_to_signature_namespace
-
-if TYPE_CHECKING:
- from typing_extensions import Self
-
- from litestar.app import Litestar
- from litestar.connection import ASGIConnection
- from litestar.controller import Controller
- from litestar.dto import AbstractDTO
- from litestar.dto._backend import DTOBackend
- from litestar.params import ParameterKwarg
- from litestar.router import Router
- from litestar.types import AnyCallable, AsyncAnyCallable, ExceptionHandler
- from litestar.types.empty import EmptyType
-
-__all__ = ("BaseRouteHandler",)
-
-
-class BaseRouteHandler:
- """Base route handler.
-
- Serves as a subclass for all route handlers
- """
-
- __slots__ = (
- "_fn",
- "_parsed_data_field",
- "_parsed_fn_signature",
- "_parsed_return_field",
- "_resolved_data_dto",
- "_resolved_dependencies",
- "_resolved_guards",
- "_resolved_layered_parameters",
- "_resolved_return_dto",
- "_resolved_signature_namespace",
- "_resolved_type_decoders",
- "_resolved_type_encoders",
- "_signature_model",
- "dependencies",
- "dto",
- "exception_handlers",
- "guards",
- "middleware",
- "name",
- "opt",
- "owner",
- "paths",
- "return_dto",
- "signature_namespace",
- "type_decoders",
- "type_encoders",
- )
-
- def __init__(
- self,
- path: str | Sequence[str] | None = None,
- *,
- dependencies: Dependencies | None = None,
- dto: type[AbstractDTO] | None | EmptyType = Empty,
- exception_handlers: ExceptionHandlersMap | None = None,
- guards: Sequence[Guard] | None = None,
- middleware: Sequence[Middleware] | None = None,
- name: str | None = None,
- opt: Mapping[str, Any] | None = None,
- return_dto: type[AbstractDTO] | None | EmptyType = Empty,
- signature_namespace: Mapping[str, Any] | None = None,
- signature_types: Sequence[Any] | None = None,
- type_decoders: TypeDecodersSequence | None = None,
- type_encoders: TypeEncodersMap | None = None,
- **kwargs: Any,
- ) -> None:
- """Initialize ``HTTPRouteHandler``.
-
- Args:
- path: A path fragment for the route handler function or a sequence of path fragments. If not given defaults
- to ``/``
- dependencies: A string keyed mapping of dependency :class:`Provider <.di.Provide>` instances.
- dto: :class:`AbstractDTO <.dto.base_dto.AbstractDTO>` to use for (de)serializing and
- validation of request data.
- exception_handlers: A mapping of status codes and/or exception types to handler functions.
- guards: A sequence of :class:`Guard <.types.Guard>` callables.
- middleware: A sequence of :class:`Middleware <.types.Middleware>`.
- name: A string identifying the route handler.
- opt: A string keyed mapping of arbitrary values that can be accessed in :class:`Guards <.types.Guard>` or
- wherever you have access to :class:`Request <.connection.Request>` or
- :class:`ASGI Scope <.types.Scope>`.
- return_dto: :class:`AbstractDTO <.dto.base_dto.AbstractDTO>` to use for serializing
- outbound response data.
- signature_namespace: A mapping of names to types for use in forward reference resolution during signature
- modelling.
- signature_types: A sequence of types for use in forward reference resolution during signature modeling.
- These types will be added to the signature namespace using their ``__name__`` attribute.
- type_decoders: A sequence of tuples, each composed of a predicate testing for type identity and a msgspec hook for deserialization.
- type_encoders: A mapping of types to callables that transform them into types supported for serialization.
- **kwargs: Any additional kwarg - will be set in the opt dictionary.
- """
- self._parsed_fn_signature: ParsedSignature | EmptyType = Empty
- self._parsed_return_field: FieldDefinition | EmptyType = Empty
- self._parsed_data_field: FieldDefinition | None | EmptyType = Empty
- self._resolved_data_dto: type[AbstractDTO] | None | EmptyType = Empty
- self._resolved_dependencies: dict[str, Provide] | EmptyType = Empty
- self._resolved_guards: list[Guard] | EmptyType = Empty
- self._resolved_layered_parameters: dict[str, FieldDefinition] | EmptyType = Empty
- self._resolved_return_dto: type[AbstractDTO] | None | EmptyType = Empty
- self._resolved_signature_namespace: dict[str, Any] | EmptyType = Empty
- self._resolved_type_decoders: TypeDecodersSequence | EmptyType = Empty
- self._resolved_type_encoders: TypeEncodersMap | EmptyType = Empty
- self._signature_model: type[SignatureModel] | EmptyType = Empty
-
- self.dependencies = dependencies
- self.dto = dto
- self.exception_handlers = exception_handlers
- self.guards = guards
- self.middleware = middleware
- self.name = name
- self.opt = dict(opt or {})
- self.opt.update(**kwargs)
- self.owner: Controller | Router | None = None
- self.return_dto = return_dto
- self.signature_namespace = add_types_to_signature_namespace(
- signature_types or [], dict(signature_namespace or {})
- )
- self.type_decoders = type_decoders
- self.type_encoders = type_encoders
-
- self.paths = (
- {normalize_path(p) for p in path} if path and isinstance(path, list) else {normalize_path(path or "/")} # type: ignore[arg-type]
- )
-
- def __call__(self, fn: AsyncAnyCallable) -> Self:
- """Replace a function with itself."""
- self._fn = fn
- return self
-
- @property
- def handler_id(self) -> str:
- """A unique identifier used for generation of DTOs."""
- return f"{self!s}::{sum(id(layer) for layer in self.ownership_layers)}"
-
- @property
- def default_deserializer(self) -> Callable[[Any, Any], Any]:
- """Get a default deserializer for the route handler.
-
- Returns:
- A default deserializer for the route handler.
-
- """
- return partial(default_deserializer, type_decoders=self.resolve_type_decoders())
-
- @property
- def default_serializer(self) -> Callable[[Any], Any]:
- """Get a default serializer for the route handler.
-
- Returns:
- A default serializer for the route handler.
-
- """
- return partial(default_serializer, type_encoders=self.resolve_type_encoders())
-
- @property
- def signature_model(self) -> type[SignatureModel]:
- """Get the signature model for the route handler.
-
- Returns:
- A signature model for the route handler.
-
- """
- if self._signature_model is Empty:
- self._signature_model = SignatureModel.create(
- dependency_name_set=self.dependency_name_set,
- fn=cast("AnyCallable", self.fn),
- parsed_signature=self.parsed_fn_signature,
- data_dto=self.resolve_data_dto(),
- type_decoders=self.resolve_type_decoders(),
- )
- return self._signature_model
-
- @property
- def fn(self) -> AsyncAnyCallable:
- """Get the handler function.
-
- Raises:
- ImproperlyConfiguredException: if handler fn is not set.
-
- Returns:
- Handler function
- """
- if not hasattr(self, "_fn"):
- raise ImproperlyConfiguredException("No callable has been registered for this handler")
- return self._fn
-
- @property
- def parsed_fn_signature(self) -> ParsedSignature:
- """Return the parsed signature of the handler function.
-
- This method is memoized so the computation occurs only once.
-
- Returns:
- A ParsedSignature instance
- """
- if self._parsed_fn_signature is Empty:
- self._parsed_fn_signature = ParsedSignature.from_fn(
- unwrap_partial(self.fn), self.resolve_signature_namespace()
- )
-
- return self._parsed_fn_signature
-
- @property
- def parsed_return_field(self) -> FieldDefinition:
- if self._parsed_return_field is Empty:
- self._parsed_return_field = self.parsed_fn_signature.return_type
- return self._parsed_return_field
-
- @property
- def parsed_data_field(self) -> FieldDefinition | None:
- if self._parsed_data_field is Empty:
- self._parsed_data_field = self.parsed_fn_signature.parameters.get("data")
- return self._parsed_data_field
-
- @property
- def handler_name(self) -> str:
- """Get the name of the handler function.
-
- Raises:
- ImproperlyConfiguredException: if handler fn is not set.
-
- Returns:
- Name of the handler function
- """
- return get_name(unwrap_partial(self.fn))
-
- @property
- def dependency_name_set(self) -> set[str]:
- """Set of all dependency names provided in the handler's ownership layers."""
- layered_dependencies = (layer.dependencies or {} for layer in self.ownership_layers)
- return {name for layer in layered_dependencies for name in layer} # pyright: ignore
-
- @property
- def ownership_layers(self) -> list[Self | Controller | Router]:
- """Return the handler layers from the app down to the route handler.
-
- ``app -> ... -> route handler``
- """
- layers = []
-
- cur: Any = self
- while cur:
- layers.append(cur)
- cur = cur.owner
-
- return list(reversed(layers))
-
- @property
- def app(self) -> Litestar:
- return cast("Litestar", self.ownership_layers[0])
-
- def resolve_type_encoders(self) -> TypeEncodersMap:
- """Return a merged type_encoders mapping.
-
- This method is memoized so the computation occurs only once.
-
- Returns:
- A dict of type encoders
- """
- if self._resolved_type_encoders is Empty:
- self._resolved_type_encoders = {}
-
- for layer in self.ownership_layers:
- if type_encoders := getattr(layer, "type_encoders", None):
- self._resolved_type_encoders.update(type_encoders)
- return cast("TypeEncodersMap", self._resolved_type_encoders)
-
- def resolve_type_decoders(self) -> TypeDecodersSequence:
- """Return a merged type_encoders mapping.
-
- This method is memoized so the computation occurs only once.
-
- Returns:
- A dict of type encoders
- """
- if self._resolved_type_decoders is Empty:
- self._resolved_type_decoders = []
-
- for layer in self.ownership_layers:
- if type_decoders := getattr(layer, "type_decoders", None):
- self._resolved_type_decoders.extend(list(type_decoders))
- return cast("TypeDecodersSequence", self._resolved_type_decoders)
-
- def resolve_layered_parameters(self) -> dict[str, FieldDefinition]:
- """Return all parameters declared above the handler."""
- if self._resolved_layered_parameters is Empty:
- parameter_kwargs: dict[str, ParameterKwarg] = {}
-
- for layer in self.ownership_layers:
- parameter_kwargs.update(getattr(layer, "parameters", {}) or {})
-
- self._resolved_layered_parameters = {
- key: FieldDefinition.from_kwarg(name=key, annotation=parameter.annotation, kwarg_definition=parameter)
- for key, parameter in parameter_kwargs.items()
- }
-
- return self._resolved_layered_parameters
-
- def resolve_guards(self) -> list[Guard]:
- """Return all guards in the handlers scope, starting from highest to current layer."""
- if self._resolved_guards is Empty:
- self._resolved_guards = []
-
- for layer in self.ownership_layers:
- self._resolved_guards.extend(layer.guards or []) # pyright: ignore
-
- self._resolved_guards = cast(
- "list[Guard]", [ensure_async_callable(guard) for guard in self._resolved_guards]
- )
-
- return self._resolved_guards
-
- def _get_plugin_registry(self) -> PluginRegistry | None:
- from litestar.app import Litestar
-
- root_owner = self.ownership_layers[0]
- if isinstance(root_owner, Litestar):
- return root_owner.plugins
- return None
-
- def resolve_dependencies(self) -> dict[str, Provide]:
- """Return all dependencies correlating to handler function's kwargs that exist in the handler's scope."""
- plugin_registry = self._get_plugin_registry()
- if self._resolved_dependencies is Empty:
- self._resolved_dependencies = {}
- for layer in self.ownership_layers:
- for key, provider in (layer.dependencies or {}).items():
- self._resolved_dependencies[key] = self._resolve_dependency(
- key=key, provider=provider, plugin_registry=plugin_registry
- )
-
- return self._resolved_dependencies
-
- def _resolve_dependency(
- self, key: str, provider: Provide | AnyCallable, plugin_registry: PluginRegistry | None
- ) -> Provide:
- if not isinstance(provider, Provide):
- provider = Provide(provider)
-
- if self._resolved_dependencies is not Empty: # pragma: no cover
- self._validate_dependency_is_unique(dependencies=self._resolved_dependencies, key=key, provider=provider)
-
- if not getattr(provider, "parsed_fn_signature", None):
- dependency = unwrap_partial(provider.dependency)
- plugin: DIPlugin | None = None
- if plugin_registry:
- plugin = next(
- (p for p in plugin_registry.di if isinstance(p, DIPlugin) and p.has_typed_init(dependency)),
- None,
- )
- if plugin:
- signature, init_type_hints = plugin.get_typed_init(dependency)
- provider.parsed_fn_signature = ParsedSignature.from_signature(signature, init_type_hints)
- else:
- provider.parsed_fn_signature = ParsedSignature.from_fn(dependency, self.resolve_signature_namespace())
-
- if not getattr(provider, "signature_model", None):
- provider.signature_model = SignatureModel.create(
- dependency_name_set=self.dependency_name_set,
- fn=provider.dependency,
- parsed_signature=provider.parsed_fn_signature,
- data_dto=self.resolve_data_dto(),
- type_decoders=self.resolve_type_decoders(),
- )
- return provider
-
- def resolve_middleware(self) -> list[Middleware]:
- """Build the middleware stack for the RouteHandler and return it.
-
- The middlewares are added from top to bottom (``app -> router -> controller -> route handler``) and then
- reversed.
- """
- resolved_middleware: list[Middleware] = []
- for layer in self.ownership_layers:
- resolved_middleware.extend(layer.middleware or []) # pyright: ignore
- return list(reversed(resolved_middleware))
-
- def resolve_exception_handlers(self) -> ExceptionHandlersMap:
- """Resolve the exception_handlers by starting from the route handler and moving up.
-
- This method is memoized so the computation occurs only once.
- """
- resolved_exception_handlers: dict[int | type[Exception], ExceptionHandler] = {}
- for layer in self.ownership_layers:
- resolved_exception_handlers.update(layer.exception_handlers or {}) # pyright: ignore
- return resolved_exception_handlers
-
- def resolve_opts(self) -> None:
- """Build the route handler opt dictionary by going from top to bottom.
-
- When merging keys from multiple layers, if the same key is defined by multiple layers, the value from the
- layer closest to the response handler will take precedence.
- """
-
- opt: dict[str, Any] = {}
- for layer in self.ownership_layers:
- opt.update(layer.opt or {}) # pyright: ignore
-
- self.opt = opt
-
- def resolve_signature_namespace(self) -> dict[str, Any]:
- """Build the route handler signature namespace dictionary by going from top to bottom.
-
- When merging keys from multiple layers, if the same key is defined by multiple layers, the value from the
- layer closest to the response handler will take precedence.
- """
- if self._resolved_layered_parameters is Empty:
- ns: dict[str, Any] = {}
- for layer in self.ownership_layers:
- ns.update(layer.signature_namespace)
-
- self._resolved_signature_namespace = ns
- return cast("dict[str, Any]", self._resolved_signature_namespace)
-
- def _get_dto_backend_cls(self) -> type[DTOBackend] | None:
- if ExperimentalFeatures.DTO_CODEGEN in self.app.experimental_features:
- from litestar.dto._codegen_backend import DTOCodegenBackend
-
- return DTOCodegenBackend
- return None
-
- def resolve_data_dto(self) -> type[AbstractDTO] | None:
- """Resolve the data_dto by starting from the route handler and moving up.
- If a handler is found it is returned, otherwise None is set.
- This method is memoized so the computation occurs only once.
-
- Returns:
- An optional :class:`DTO type <.dto.base_dto.AbstractDTO>`
- """
- if self._resolved_data_dto is Empty:
- if data_dtos := cast(
- "list[type[AbstractDTO] | None]",
- [layer.dto for layer in self.ownership_layers if layer.dto is not Empty],
- ):
- data_dto: type[AbstractDTO] | None = data_dtos[-1]
- elif self.parsed_data_field and (
- plugins_for_data_type := [
- plugin
- for plugin in self.app.plugins.serialization
- if self.parsed_data_field.match_predicate_recursively(plugin.supports_type)
- ]
- ):
- data_dto = plugins_for_data_type[0].create_dto_for_type(self.parsed_data_field)
- else:
- data_dto = None
-
- if self.parsed_data_field and data_dto:
- data_dto.create_for_field_definition(
- field_definition=self.parsed_data_field,
- handler_id=self.handler_id,
- backend_cls=self._get_dto_backend_cls(),
- )
-
- self._resolved_data_dto = data_dto
-
- return self._resolved_data_dto
-
- def resolve_return_dto(self) -> type[AbstractDTO] | None:
- """Resolve the return_dto by starting from the route handler and moving up.
- If a handler is found it is returned, otherwise None is set.
- This method is memoized so the computation occurs only once.
-
- Returns:
- An optional :class:`DTO type <.dto.base_dto.AbstractDTO>`
- """
- if self._resolved_return_dto is Empty:
- if return_dtos := cast(
- "list[type[AbstractDTO] | None]",
- [layer.return_dto for layer in self.ownership_layers if layer.return_dto is not Empty],
- ):
- return_dto: type[AbstractDTO] | None = return_dtos[-1]
- elif plugins_for_return_type := [
- plugin
- for plugin in self.app.plugins.serialization
- if self.parsed_return_field.match_predicate_recursively(plugin.supports_type)
- ]:
- return_dto = plugins_for_return_type[0].create_dto_for_type(self.parsed_return_field)
- else:
- return_dto = self.resolve_data_dto()
-
- if return_dto and return_dto.is_supported_model_type_field(self.parsed_return_field):
- return_dto.create_for_field_definition(
- field_definition=self.parsed_return_field,
- handler_id=self.handler_id,
- backend_cls=self._get_dto_backend_cls(),
- )
- self._resolved_return_dto = return_dto
- else:
- self._resolved_return_dto = None
-
- return self._resolved_return_dto
-
- async def authorize_connection(self, connection: ASGIConnection) -> None:
- """Ensure the connection is authorized by running all the route guards in scope."""
- for guard in self.resolve_guards():
- await guard(connection, copy(self)) # type: ignore[misc]
-
- @staticmethod
- def _validate_dependency_is_unique(dependencies: dict[str, Provide], key: str, provider: Provide) -> None:
- """Validate that a given provider has not been already defined under a different key."""
- for dependency_key, value in dependencies.items():
- if provider == value:
- raise ImproperlyConfiguredException(
- f"Provider for key {key} is already defined under the different key {dependency_key}. "
- f"If you wish to override a provider, it must have the same key."
- )
-
- def on_registration(self, app: Litestar) -> None:
- """Called once per handler when the app object is instantiated.
-
- Args:
- app: The :class:`Litestar<.app.Litestar>` app object.
-
- Returns:
- None
- """
- self._validate_handler_function()
- self.resolve_dependencies()
- self.resolve_guards()
- self.resolve_middleware()
- self.resolve_opts()
- self.resolve_data_dto()
- self.resolve_return_dto()
-
- def _validate_handler_function(self) -> None:
- """Validate the route handler function once set by inspecting its return annotations."""
- if (
- self.parsed_data_field is not None
- and self.parsed_data_field.is_subclass_of(DTOData)
- and not self.resolve_data_dto()
- ):
- raise ImproperlyConfiguredException(
- f"Handler function {self.handler_name} has a data parameter that is a subclass of DTOData but no "
- "DTO has been registered for it."
- )
-
- def __str__(self) -> str:
- """Return a unique identifier for the route handler.
-
- Returns:
- A string
- """
- target: type[AsyncAnyCallable] | AsyncAnyCallable # pyright: ignore
- target = unwrap_partial(self.fn)
- if not hasattr(target, "__qualname__"):
- target = type(target)
- return f"{target.__module__}.{target.__qualname__}"
diff --git a/venv/lib/python3.11/site-packages/litestar/handlers/http_handlers/__init__.py b/venv/lib/python3.11/site-packages/litestar/handlers/http_handlers/__init__.py
deleted file mode 100644
index 844f046..0000000
--- a/venv/lib/python3.11/site-packages/litestar/handlers/http_handlers/__init__.py
+++ /dev/null
@@ -1,15 +0,0 @@
-from __future__ import annotations
-
-from .base import HTTPRouteHandler, route
-from .decorators import delete, get, head, patch, post, put
-
-__all__ = (
- "HTTPRouteHandler",
- "delete",
- "get",
- "head",
- "patch",
- "post",
- "put",
- "route",
-)
diff --git a/venv/lib/python3.11/site-packages/litestar/handlers/http_handlers/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/litestar/handlers/http_handlers/__pycache__/__init__.cpython-311.pyc
deleted file mode 100644
index 848ac8f..0000000
--- a/venv/lib/python3.11/site-packages/litestar/handlers/http_handlers/__pycache__/__init__.cpython-311.pyc
+++ /dev/null
Binary files differ
diff --git a/venv/lib/python3.11/site-packages/litestar/handlers/http_handlers/__pycache__/_utils.cpython-311.pyc b/venv/lib/python3.11/site-packages/litestar/handlers/http_handlers/__pycache__/_utils.cpython-311.pyc
deleted file mode 100644
index 22a7f67..0000000
--- a/venv/lib/python3.11/site-packages/litestar/handlers/http_handlers/__pycache__/_utils.cpython-311.pyc
+++ /dev/null
Binary files differ
diff --git a/venv/lib/python3.11/site-packages/litestar/handlers/http_handlers/__pycache__/base.cpython-311.pyc b/venv/lib/python3.11/site-packages/litestar/handlers/http_handlers/__pycache__/base.cpython-311.pyc
deleted file mode 100644
index eb39166..0000000
--- a/venv/lib/python3.11/site-packages/litestar/handlers/http_handlers/__pycache__/base.cpython-311.pyc
+++ /dev/null
Binary files differ
diff --git a/venv/lib/python3.11/site-packages/litestar/handlers/http_handlers/__pycache__/decorators.cpython-311.pyc b/venv/lib/python3.11/site-packages/litestar/handlers/http_handlers/__pycache__/decorators.cpython-311.pyc
deleted file mode 100644
index 0acd7c8..0000000
--- a/venv/lib/python3.11/site-packages/litestar/handlers/http_handlers/__pycache__/decorators.cpython-311.pyc
+++ /dev/null
Binary files differ
diff --git a/venv/lib/python3.11/site-packages/litestar/handlers/http_handlers/_utils.py b/venv/lib/python3.11/site-packages/litestar/handlers/http_handlers/_utils.py
deleted file mode 100644
index ec95145..0000000
--- a/venv/lib/python3.11/site-packages/litestar/handlers/http_handlers/_utils.py
+++ /dev/null
@@ -1,221 +0,0 @@
-from __future__ import annotations
-
-from functools import lru_cache
-from inspect import isawaitable
-from typing import TYPE_CHECKING, Any, Sequence, cast
-
-from litestar.enums import HttpMethod
-from litestar.exceptions import ValidationException
-from litestar.response import Response
-from litestar.status_codes import HTTP_200_OK, HTTP_201_CREATED, HTTP_204_NO_CONTENT
-from litestar.types.builtin_types import NoneType
-
-if TYPE_CHECKING:
- from litestar.app import Litestar
- from litestar.background_tasks import BackgroundTask, BackgroundTasks
- from litestar.connection import Request
- from litestar.datastructures import Cookie, ResponseHeader
- from litestar.types import AfterRequestHookHandler, ASGIApp, AsyncAnyCallable, Method, TypeEncodersMap
- from litestar.typing import FieldDefinition
-
-__all__ = (
- "create_data_handler",
- "create_generic_asgi_response_handler",
- "create_response_handler",
- "get_default_status_code",
- "is_empty_response_annotation",
- "normalize_headers",
- "normalize_http_method",
-)
-
-
-def create_data_handler(
- after_request: AfterRequestHookHandler | None,
- background: BackgroundTask | BackgroundTasks | None,
- cookies: frozenset[Cookie],
- headers: frozenset[ResponseHeader],
- media_type: str,
- response_class: type[Response],
- status_code: int,
- type_encoders: TypeEncodersMap | None,
-) -> AsyncAnyCallable:
- """Create a handler function for arbitrary data.
-
- Args:
- after_request: An after request handler.
- background: A background task or background tasks.
- cookies: A set of pre-defined cookies.
- headers: A set of response headers.
- media_type: The response media type.
- response_class: The response class to use.
- status_code: The response status code.
- type_encoders: A mapping of types to encoder functions.
-
- Returns:
- A handler function.
-
- """
-
- async def handler(
- data: Any,
- request: Request[Any, Any, Any],
- app: Litestar,
- **kwargs: Any,
- ) -> ASGIApp:
- if isawaitable(data):
- data = await data
-
- response = response_class(
- background=background,
- content=data,
- media_type=media_type,
- status_code=status_code,
- type_encoders=type_encoders,
- )
-
- if after_request:
- response = await after_request(response) # type: ignore[arg-type,misc]
-
- return response.to_asgi_response(app=None, request=request, headers=normalize_headers(headers), cookies=cookies) # pyright: ignore
-
- return handler
-
-
-def create_generic_asgi_response_handler(after_request: AfterRequestHookHandler | None) -> AsyncAnyCallable:
- """Create a handler function for Responses.
-
- Args:
- after_request: An after request handler.
-
- Returns:
- A handler function.
- """
-
- async def handler(data: ASGIApp, **kwargs: Any) -> ASGIApp:
- return await after_request(data) if after_request else data # type: ignore[arg-type, misc, no-any-return]
-
- return handler
-
-
-@lru_cache(1024)
-def normalize_headers(headers: frozenset[ResponseHeader]) -> dict[str, str]:
- """Given a dictionary of ResponseHeader, filter them and return a dictionary of values.
-
- Args:
- headers: A dictionary of :class:`ResponseHeader <litestar.datastructures.ResponseHeader>` values
-
- Returns:
- A string keyed dictionary of normalized values
- """
- return {
- header.name: cast("str", header.value) # we know value to be a string at this point because we validate it
- # that it's not None when initializing a header with documentation_only=True
- for header in headers
- if not header.documentation_only
- }
-
-
-def create_response_handler(
- after_request: AfterRequestHookHandler | None,
- background: BackgroundTask | BackgroundTasks | None,
- cookies: frozenset[Cookie],
- headers: frozenset[ResponseHeader],
- media_type: str,
- status_code: int,
- type_encoders: TypeEncodersMap | None,
-) -> AsyncAnyCallable:
- """Create a handler function for Litestar Responses.
-
- Args:
- after_request: An after request handler.
- background: A background task or background tasks.
- cookies: A set of pre-defined cookies.
- headers: A set of response headers.
- media_type: The response media type.
- status_code: The response status code.
- type_encoders: A mapping of types to encoder functions.
-
- Returns:
- A handler function.
- """
-
- normalized_headers = normalize_headers(headers)
- cookie_list = list(cookies)
-
- async def handler(
- data: Response,
- app: Litestar,
- request: Request,
- **kwargs: Any, # kwargs is for return dto
- ) -> ASGIApp:
- response = await after_request(data) if after_request else data # type:ignore[arg-type,misc]
- return response.to_asgi_response( # type: ignore[no-any-return]
- app=None,
- background=background,
- cookies=cookie_list,
- headers=normalized_headers,
- media_type=media_type,
- request=request,
- status_code=status_code,
- type_encoders=type_encoders,
- )
-
- return handler
-
-
-def normalize_http_method(http_methods: HttpMethod | Method | Sequence[HttpMethod | Method]) -> set[Method]:
- """Normalize HTTP method(s) into a set of upper-case method names.
-
- Args:
- http_methods: A value for http method.
-
- Returns:
- A normalized set of http methods.
- """
- output: set[str] = set()
-
- if isinstance(http_methods, str):
- http_methods = [http_methods] # pyright: ignore
-
- for method in http_methods:
- method_name = method.value.upper() if isinstance(method, HttpMethod) else method.upper()
- if method_name not in HTTP_METHOD_NAMES:
- raise ValidationException(f"Invalid HTTP method: {method_name}")
- output.add(method_name)
-
- return cast("set[Method]", output)
-
-
-def get_default_status_code(http_methods: set[Method]) -> int:
- """Return the default status code for a given set of HTTP methods.
-
- Args:
- http_methods: A set of method strings
-
- Returns:
- A status code
- """
- if HttpMethod.POST in http_methods:
- return HTTP_201_CREATED
- if HttpMethod.DELETE in http_methods:
- return HTTP_204_NO_CONTENT
- return HTTP_200_OK
-
-
-def is_empty_response_annotation(return_annotation: FieldDefinition) -> bool:
- """Return whether the return annotation is an empty response.
-
- Args:
- return_annotation: A return annotation.
-
- Returns:
- Whether the return annotation is an empty response.
- """
- return (
- return_annotation.is_subclass_of(NoneType)
- or return_annotation.is_subclass_of(Response)
- and return_annotation.has_inner_subclass_of(NoneType)
- )
-
-
-HTTP_METHOD_NAMES = {m.value for m in HttpMethod}
diff --git a/venv/lib/python3.11/site-packages/litestar/handlers/http_handlers/base.py b/venv/lib/python3.11/site-packages/litestar/handlers/http_handlers/base.py
deleted file mode 100644
index 757253e..0000000
--- a/venv/lib/python3.11/site-packages/litestar/handlers/http_handlers/base.py
+++ /dev/null
@@ -1,591 +0,0 @@
-from __future__ import annotations
-
-from enum import Enum
-from typing import TYPE_CHECKING, AnyStr, Mapping, Sequence, TypedDict, cast
-
-from litestar._layers.utils import narrow_response_cookies, narrow_response_headers
-from litestar.connection import Request
-from litestar.datastructures.cookie import Cookie
-from litestar.datastructures.response_header import ResponseHeader
-from litestar.enums import HttpMethod, MediaType
-from litestar.exceptions import (
- HTTPException,
- ImproperlyConfiguredException,
-)
-from litestar.handlers.base import BaseRouteHandler
-from litestar.handlers.http_handlers._utils import (
- create_data_handler,
- create_generic_asgi_response_handler,
- create_response_handler,
- get_default_status_code,
- is_empty_response_annotation,
- normalize_http_method,
-)
-from litestar.openapi.spec import Operation
-from litestar.response import Response
-from litestar.status_codes import HTTP_204_NO_CONTENT, HTTP_304_NOT_MODIFIED
-from litestar.types import (
- AfterRequestHookHandler,
- AfterResponseHookHandler,
- AnyCallable,
- ASGIApp,
- BeforeRequestHookHandler,
- CacheKeyBuilder,
- Dependencies,
- Empty,
- EmptyType,
- ExceptionHandlersMap,
- Guard,
- Method,
- Middleware,
- ResponseCookies,
- ResponseHeaders,
- TypeEncodersMap,
-)
-from litestar.utils import ensure_async_callable
-from litestar.utils.predicates import is_async_callable
-from litestar.utils.warnings import warn_implicit_sync_to_thread, warn_sync_to_thread_with_async_callable
-
-if TYPE_CHECKING:
- from typing import Any, Awaitable, Callable
-
- from litestar.app import Litestar
- from litestar.background_tasks import BackgroundTask, BackgroundTasks
- from litestar.config.response_cache import CACHE_FOREVER
- from litestar.datastructures import CacheControlHeader, ETag
- from litestar.dto import AbstractDTO
- from litestar.openapi.datastructures import ResponseSpec
- from litestar.openapi.spec import SecurityRequirement
- from litestar.types.callable_types import AsyncAnyCallable, OperationIDCreator
- from litestar.types.composite_types import TypeDecodersSequence
-
-__all__ = ("HTTPRouteHandler", "route")
-
-
-class ResponseHandlerMap(TypedDict):
- default_handler: Callable[[Any], Awaitable[ASGIApp]] | EmptyType
- response_type_handler: Callable[[Any], Awaitable[ASGIApp]] | EmptyType
-
-
-class HTTPRouteHandler(BaseRouteHandler):
- """HTTP Route Decorator.
-
- Use this decorator to decorate an HTTP handler with multiple methods.
- """
-
- __slots__ = (
- "_resolved_after_response",
- "_resolved_before_request",
- "_response_handler_mapping",
- "_resolved_include_in_schema",
- "_resolved_tags",
- "_resolved_security",
- "after_request",
- "after_response",
- "background",
- "before_request",
- "cache",
- "cache_control",
- "cache_key_builder",
- "content_encoding",
- "content_media_type",
- "deprecated",
- "description",
- "etag",
- "has_sync_callable",
- "http_methods",
- "include_in_schema",
- "media_type",
- "operation_class",
- "operation_id",
- "raises",
- "request_class",
- "response_class",
- "response_cookies",
- "response_description",
- "response_headers",
- "responses",
- "security",
- "status_code",
- "summary",
- "sync_to_thread",
- "tags",
- "template_name",
- )
-
- has_sync_callable: bool
-
- def __init__(
- self,
- path: str | Sequence[str] | None = None,
- *,
- after_request: AfterRequestHookHandler | None = None,
- after_response: AfterResponseHookHandler | None = None,
- background: BackgroundTask | BackgroundTasks | None = None,
- before_request: BeforeRequestHookHandler | None = None,
- cache: bool | int | type[CACHE_FOREVER] = False,
- cache_control: CacheControlHeader | None = None,
- cache_key_builder: CacheKeyBuilder | None = None,
- dependencies: Dependencies | None = None,
- dto: type[AbstractDTO] | None | EmptyType = Empty,
- etag: ETag | None = None,
- exception_handlers: ExceptionHandlersMap | None = None,
- guards: Sequence[Guard] | None = None,
- http_method: HttpMethod | Method | Sequence[HttpMethod | Method],
- media_type: MediaType | str | None = None,
- middleware: Sequence[Middleware] | None = None,
- name: str | None = None,
- opt: Mapping[str, Any] | None = None,
- request_class: type[Request] | None = None,
- response_class: type[Response] | None = None,
- response_cookies: ResponseCookies | None = None,
- response_headers: ResponseHeaders | None = None,
- return_dto: type[AbstractDTO] | None | EmptyType = Empty,
- status_code: int | None = None,
- sync_to_thread: bool | None = None,
- # OpenAPI related attributes
- content_encoding: str | None = None,
- content_media_type: str | None = None,
- deprecated: bool = False,
- description: str | None = None,
- include_in_schema: bool | EmptyType = Empty,
- operation_class: type[Operation] = Operation,
- operation_id: str | OperationIDCreator | None = None,
- raises: Sequence[type[HTTPException]] | None = None,
- response_description: str | None = None,
- responses: Mapping[int, ResponseSpec] | None = None,
- signature_namespace: Mapping[str, Any] | None = None,
- security: Sequence[SecurityRequirement] | None = None,
- summary: str | None = None,
- tags: Sequence[str] | None = None,
- type_decoders: TypeDecodersSequence | None = None,
- type_encoders: TypeEncodersMap | None = None,
- **kwargs: Any,
- ) -> None:
- """Initialize ``HTTPRouteHandler``.
-
- Args:
- path: A path fragment for the route handler function or a sequence of path fragments.
- If not given defaults to ``/``
- after_request: A sync or async function executed before a :class:`Request <.connection.Request>` is passed
- to any route handler. If this function returns a value, the request will not reach the route handler,
- and instead this value will be used.
- after_response: A sync or async function called after the response has been awaited. It receives the
- :class:`Request <.connection.Request>` object and should not return any values.
- background: A :class:`BackgroundTask <.background_tasks.BackgroundTask>` instance or
- :class:`BackgroundTasks <.background_tasks.BackgroundTasks>` to execute after the response is finished.
- Defaults to ``None``.
- before_request: A sync or async function called immediately before calling the route handler. Receives
- the :class:`Request <.connection.Request>` instance and any non-``None`` return value is used for the
- response, bypassing the route handler.
- cache: Enables response caching if configured on the application level. Valid values are ``True`` or a
- number of seconds (e.g. ``120``) to cache the response.
- cache_control: A ``cache-control`` header of type
- :class:`CacheControlHeader <.datastructures.CacheControlHeader>` that will be added to the response.
- cache_key_builder: A :class:`cache-key builder function <.types.CacheKeyBuilder>`. Allows for customization
- of the cache key if caching is configured on the application level.
- dependencies: A string keyed mapping of dependency :class:`Provider <.di.Provide>` instances.
- dto: :class:`AbstractDTO <.dto.base_dto.AbstractDTO>` to use for (de)serializing and
- validation of request data.
- etag: An ``etag`` header of type :class:`ETag <.datastructures.ETag>` that will be added to the response.
- exception_handlers: A mapping of status codes and/or exception types to handler functions.
- guards: A sequence of :class:`Guard <.types.Guard>` callables.
- http_method: An :class:`http method string <.types.Method>`, a member of the enum
- :class:`HttpMethod <.enums.HttpMethod>` or a list of these that correlates to the methods the route
- handler function should handle.
- media_type: A member of the :class:`MediaType <.enums.MediaType>` enum or a string with a valid IANA
- Media-Type.
- middleware: A sequence of :class:`Middleware <.types.Middleware>`.
- name: A string identifying the route handler.
- opt: A string keyed mapping of arbitrary values that can be accessed in :class:`Guards <.types.Guard>` or
- wherever you have access to :class:`Request <.connection.Request>` or
- :class:`ASGI Scope <.types.Scope>`.
- request_class: A custom subclass of :class:`Request <.connection.Request>` to be used as route handler's
- default request.
- response_class: A custom subclass of :class:`Response <.response.Response>` to be used as route handler's
- default response.
- response_cookies: A sequence of :class:`Cookie <.datastructures.Cookie>` instances.
- response_headers: A string keyed mapping of :class:`ResponseHeader <.datastructures.ResponseHeader>`
- instances.
- responses: A mapping of additional status codes and a description of their expected content.
- This information will be included in the OpenAPI schema
- return_dto: :class:`AbstractDTO <.dto.base_dto.AbstractDTO>` to use for serializing
- outbound response data.
- signature_namespace: A mapping of names to types for use in forward reference resolution during signature modelling.
- status_code: An http status code for the response. Defaults to ``200`` for mixed method or ``GET``, ``PUT`` and
- ``PATCH``, ``201`` for ``POST`` and ``204`` for ``DELETE``.
- sync_to_thread: A boolean dictating whether the handler function will be executed in a worker thread or the
- main event loop. This has an effect only for sync handler functions. See using sync handler functions.
- content_encoding: A string describing the encoding of the content, e.g. ``"base64"``.
- content_media_type: A string designating the media-type of the content, e.g. ``"image/png"``.
- deprecated: A boolean dictating whether this route should be marked as deprecated in the OpenAPI schema.
- description: Text used for the route's schema description section.
- include_in_schema: A boolean flag dictating whether the route handler should be documented in the OpenAPI schema.
- operation_class: :class:`Operation <.openapi.spec.operation.Operation>` to be used with the route's OpenAPI schema.
- operation_id: Either a string or a callable returning a string. An identifier used for the route's schema operationId.
- raises: A list of exception classes extending from litestar.HttpException that is used for the OpenAPI documentation.
- This list should describe all exceptions raised within the route handler's function/method. The Litestar
- ValidationException will be added automatically for the schema if any validation is involved.
- response_description: Text used for the route's response schema description section.
- security: A sequence of dictionaries that contain information about which security scheme can be used on the endpoint.
- summary: Text used for the route's schema summary section.
- tags: A sequence of string tags that will be appended to the OpenAPI schema.
- type_decoders: A sequence of tuples, each composed of a predicate testing for type identity and a msgspec hook for deserialization.
- type_encoders: A mapping of types to callables that transform them into types supported for serialization.
- **kwargs: Any additional kwarg - will be set in the opt dictionary.
- """
- if not http_method:
- raise ImproperlyConfiguredException("An http_method kwarg is required")
-
- self.http_methods = normalize_http_method(http_methods=http_method)
- self.status_code = status_code or get_default_status_code(http_methods=self.http_methods)
-
- super().__init__(
- path=path,
- dependencies=dependencies,
- dto=dto,
- exception_handlers=exception_handlers,
- guards=guards,
- middleware=middleware,
- name=name,
- opt=opt,
- return_dto=return_dto,
- signature_namespace=signature_namespace,
- type_decoders=type_decoders,
- type_encoders=type_encoders,
- **kwargs,
- )
-
- self.after_request = ensure_async_callable(after_request) if after_request else None # pyright: ignore
- self.after_response = ensure_async_callable(after_response) if after_response else None
- self.background = background
- self.before_request = ensure_async_callable(before_request) if before_request else None
- self.cache = cache
- self.cache_control = cache_control
- self.cache_key_builder = cache_key_builder
- self.etag = etag
- self.media_type: MediaType | str = media_type or ""
- self.request_class = request_class
- self.response_class = response_class
- self.response_cookies: Sequence[Cookie] | None = narrow_response_cookies(response_cookies)
- self.response_headers: Sequence[ResponseHeader] | None = narrow_response_headers(response_headers)
-
- self.sync_to_thread = sync_to_thread
- # OpenAPI related attributes
- self.content_encoding = content_encoding
- self.content_media_type = content_media_type
- self.deprecated = deprecated
- self.description = description
- self.include_in_schema = include_in_schema
- self.operation_class = operation_class
- self.operation_id = operation_id
- self.raises = raises
- self.response_description = response_description
- self.summary = summary
- self.tags = tags
- self.security = security
- self.responses = responses
- # memoized attributes, defaulted to Empty
- self._resolved_after_response: AsyncAnyCallable | None | EmptyType = Empty
- self._resolved_before_request: AsyncAnyCallable | None | EmptyType = Empty
- self._response_handler_mapping: ResponseHandlerMap = {"default_handler": Empty, "response_type_handler": Empty}
- self._resolved_include_in_schema: bool | EmptyType = Empty
- self._resolved_security: list[SecurityRequirement] | EmptyType = Empty
- self._resolved_tags: list[str] | EmptyType = Empty
-
- def __call__(self, fn: AnyCallable) -> HTTPRouteHandler:
- """Replace a function with itself."""
- if not is_async_callable(fn):
- if self.sync_to_thread is None:
- warn_implicit_sync_to_thread(fn, stacklevel=3)
- elif self.sync_to_thread is not None:
- warn_sync_to_thread_with_async_callable(fn, stacklevel=3)
-
- super().__call__(fn)
- return self
-
- def resolve_request_class(self) -> type[Request]:
- """Return the closest custom Request class in the owner graph or the default Request class.
-
- This method is memoized so the computation occurs only once.
-
- Returns:
- The default :class:`Request <.connection.Request>` class for the route handler.
- """
- return next(
- (layer.request_class for layer in reversed(self.ownership_layers) if layer.request_class is not None),
- Request,
- )
-
- def resolve_response_class(self) -> type[Response]:
- """Return the closest custom Response class in the owner graph or the default Response class.
-
- This method is memoized so the computation occurs only once.
-
- Returns:
- The default :class:`Response <.response.Response>` class for the route handler.
- """
- return next(
- (layer.response_class for layer in reversed(self.ownership_layers) if layer.response_class is not None),
- Response,
- )
-
- def resolve_response_headers(self) -> frozenset[ResponseHeader]:
- """Return all header parameters in the scope of the handler function.
-
- Returns:
- A dictionary mapping keys to :class:`ResponseHeader <.datastructures.ResponseHeader>` instances.
- """
- resolved_response_headers: dict[str, ResponseHeader] = {}
-
- for layer in self.ownership_layers:
- if layer_response_headers := layer.response_headers:
- if isinstance(layer_response_headers, Mapping):
- # this can't happen unless you manually set response_headers on an instance, which would result in a
- # type-checking error on everything but the controller. We cover this case nevertheless
- resolved_response_headers.update(
- {name: ResponseHeader(name=name, value=value) for name, value in layer_response_headers.items()}
- )
- else:
- resolved_response_headers.update({h.name: h for h in layer_response_headers})
- for extra_header in ("cache_control", "etag"):
- if header_model := getattr(layer, extra_header, None):
- resolved_response_headers[header_model.HEADER_NAME] = ResponseHeader(
- name=header_model.HEADER_NAME,
- value=header_model.to_header(),
- documentation_only=header_model.documentation_only,
- )
-
- return frozenset(resolved_response_headers.values())
-
- def resolve_response_cookies(self) -> frozenset[Cookie]:
- """Return a list of Cookie instances. Filters the list to ensure each cookie key is unique.
-
- Returns:
- A list of :class:`Cookie <.datastructures.Cookie>` instances.
- """
- response_cookies: set[Cookie] = set()
- for layer in reversed(self.ownership_layers):
- if layer_response_cookies := layer.response_cookies:
- if isinstance(layer_response_cookies, Mapping):
- # this can't happen unless you manually set response_cookies on an instance, which would result in a
- # type-checking error on everything but the controller. We cover this case nevertheless
- response_cookies.update(
- {Cookie(key=key, value=value) for key, value in layer_response_cookies.items()}
- )
- else:
- response_cookies.update(cast("set[Cookie]", layer_response_cookies))
- return frozenset(response_cookies)
-
- def resolve_before_request(self) -> AsyncAnyCallable | None:
- """Resolve the before_handler handler by starting from the route handler and moving up.
-
- If a handler is found it is returned, otherwise None is set.
- This method is memoized so the computation occurs only once.
-
- Returns:
- An optional :class:`before request lifecycle hook handler <.types.BeforeRequestHookHandler>`
- """
- if self._resolved_before_request is Empty:
- before_request_handlers = [layer.before_request for layer in self.ownership_layers if layer.before_request]
- self._resolved_before_request = before_request_handlers[-1] if before_request_handlers else None
- return cast("AsyncAnyCallable | None", self._resolved_before_request)
-
- def resolve_after_response(self) -> AsyncAnyCallable | None:
- """Resolve the after_response handler by starting from the route handler and moving up.
-
- If a handler is found it is returned, otherwise None is set.
- This method is memoized so the computation occurs only once.
-
- Returns:
- An optional :class:`after response lifecycle hook handler <.types.AfterResponseHookHandler>`
- """
- if self._resolved_after_response is Empty:
- after_response_handlers: list[AsyncAnyCallable] = [
- layer.after_response # type: ignore[misc]
- for layer in self.ownership_layers
- if layer.after_response
- ]
- self._resolved_after_response = after_response_handlers[-1] if after_response_handlers else None
-
- return cast("AsyncAnyCallable | None", self._resolved_after_response)
-
- def resolve_include_in_schema(self) -> bool:
- """Resolve the 'include_in_schema' property by starting from the route handler and moving up.
-
- If 'include_in_schema' is found in any of the ownership layers, the last value found is returned.
- If not found in any layer, the default value ``True`` is returned.
-
- Returns:
- bool: The resolved 'include_in_schema' property.
- """
- if self._resolved_include_in_schema is Empty:
- include_in_schemas = [
- i.include_in_schema for i in self.ownership_layers if isinstance(i.include_in_schema, bool)
- ]
- self._resolved_include_in_schema = include_in_schemas[-1] if include_in_schemas else True
-
- return self._resolved_include_in_schema
-
- def resolve_security(self) -> list[SecurityRequirement]:
- """Resolve the security property by starting from the route handler and moving up.
-
- Security requirements are additive, so the security requirements of the route handler are the sum of all
- security requirements of the ownership layers.
-
- Returns:
- list[SecurityRequirement]: The resolved security property.
- """
- if self._resolved_security is Empty:
- self._resolved_security = []
- for layer in self.ownership_layers:
- if isinstance(layer.security, Sequence):
- self._resolved_security.extend(layer.security)
-
- return self._resolved_security
-
- def resolve_tags(self) -> list[str]:
- """Resolve the tags property by starting from the route handler and moving up.
-
- Tags are additive, so the tags of the route handler are the sum of all tags of the ownership layers.
-
- Returns:
- list[str]: A sorted list of unique tags.
- """
- if self._resolved_tags is Empty:
- tag_set = set()
- for layer in self.ownership_layers:
- for tag in layer.tags or []:
- tag_set.add(tag)
- self._resolved_tags = sorted(tag_set)
-
- return self._resolved_tags
-
- def get_response_handler(self, is_response_type_data: bool = False) -> Callable[[Any], Awaitable[ASGIApp]]:
- """Resolve the response_handler function for the route handler.
-
- This method is memoized so the computation occurs only once.
-
- Args:
- is_response_type_data: Whether to return a handler for 'Response' instances.
-
- Returns:
- Async Callable to handle an HTTP Request
- """
- if self._response_handler_mapping["default_handler"] is Empty:
- after_request_handlers: list[AsyncAnyCallable] = [
- layer.after_request # type: ignore[misc]
- for layer in self.ownership_layers
- if layer.after_request
- ]
- after_request = cast(
- "AfterRequestHookHandler | None",
- after_request_handlers[-1] if after_request_handlers else None,
- )
-
- media_type = self.media_type.value if isinstance(self.media_type, Enum) else self.media_type
- response_class = self.resolve_response_class()
- headers = self.resolve_response_headers()
- cookies = self.resolve_response_cookies()
- type_encoders = self.resolve_type_encoders()
-
- return_type = self.parsed_fn_signature.return_type
- return_annotation = return_type.annotation
-
- self._response_handler_mapping["response_type_handler"] = response_type_handler = create_response_handler(
- after_request=after_request,
- background=self.background,
- cookies=cookies,
- headers=headers,
- media_type=media_type,
- status_code=self.status_code,
- type_encoders=type_encoders,
- )
-
- if return_type.is_subclass_of(Response):
- self._response_handler_mapping["default_handler"] = response_type_handler
- elif is_async_callable(return_annotation) or return_annotation is ASGIApp:
- self._response_handler_mapping["default_handler"] = create_generic_asgi_response_handler(
- after_request=after_request
- )
- else:
- self._response_handler_mapping["default_handler"] = create_data_handler(
- after_request=after_request,
- background=self.background,
- cookies=cookies,
- headers=headers,
- media_type=media_type,
- response_class=response_class,
- status_code=self.status_code,
- type_encoders=type_encoders,
- )
-
- return cast(
- "Callable[[Any], Awaitable[ASGIApp]]",
- self._response_handler_mapping["response_type_handler"]
- if is_response_type_data
- else self._response_handler_mapping["default_handler"],
- )
-
- async def to_response(self, app: Litestar, data: Any, request: Request) -> ASGIApp:
- """Return a :class:`Response <.response.Response>` from the handler by resolving and calling it.
-
- Args:
- app: The :class:`Litestar <litestar.app.Litestar>` app instance
- data: Either an instance of a :class:`Response <.response.Response>`,
- a Response instance or an arbitrary value.
- request: A :class:`Request <.connection.Request>` instance
-
- Returns:
- A Response instance
- """
- if return_dto_type := self.resolve_return_dto():
- data = return_dto_type(request).data_to_encodable_type(data)
-
- response_handler = self.get_response_handler(is_response_type_data=isinstance(data, Response))
- return await response_handler(app=app, data=data, request=request) # type: ignore[call-arg]
-
- def on_registration(self, app: Litestar) -> None:
- super().on_registration(app)
- self.resolve_after_response()
- self.resolve_include_in_schema()
- self.has_sync_callable = not is_async_callable(self.fn)
-
- if self.has_sync_callable and self.sync_to_thread:
- self._fn = ensure_async_callable(self.fn)
- self.has_sync_callable = False
-
- def _validate_handler_function(self) -> None:
- """Validate the route handler function once it is set by inspecting its return annotations."""
- super()._validate_handler_function()
-
- return_type = self.parsed_fn_signature.return_type
-
- if return_type.annotation is Empty:
- raise ImproperlyConfiguredException(
- "A return value of a route handler function should be type annotated. "
- "If your function doesn't return a value, annotate it as returning 'None'."
- )
-
- if (
- self.status_code < 200 or self.status_code in {HTTP_204_NO_CONTENT, HTTP_304_NOT_MODIFIED}
- ) and not is_empty_response_annotation(return_type):
- raise ImproperlyConfiguredException(
- "A status code 204, 304 or in the range below 200 does not support a response body. "
- "If the function should return a value, change the route handler status code to an appropriate value.",
- )
-
- if not self.media_type:
- if return_type.is_subclass_of((str, bytes)) or return_type.annotation is AnyStr:
- self.media_type = MediaType.TEXT
- elif not return_type.is_subclass_of(Response):
- self.media_type = MediaType.JSON
-
- if "socket" in self.parsed_fn_signature.parameters:
- raise ImproperlyConfiguredException("The 'socket' kwarg is not supported with http handlers")
-
- if "data" in self.parsed_fn_signature.parameters and "GET" in self.http_methods:
- raise ImproperlyConfiguredException("'data' kwarg is unsupported for 'GET' request handlers")
-
-
-route = HTTPRouteHandler
diff --git a/venv/lib/python3.11/site-packages/litestar/handlers/http_handlers/decorators.py b/venv/lib/python3.11/site-packages/litestar/handlers/http_handlers/decorators.py
deleted file mode 100644
index 1ae72e5..0000000
--- a/venv/lib/python3.11/site-packages/litestar/handlers/http_handlers/decorators.py
+++ /dev/null
@@ -1,1096 +0,0 @@
-from __future__ import annotations
-
-from typing import TYPE_CHECKING
-
-from litestar.enums import HttpMethod, MediaType
-from litestar.exceptions import HTTPException, ImproperlyConfiguredException
-from litestar.openapi.spec import Operation
-from litestar.response.file import ASGIFileResponse, File
-from litestar.types import Empty, TypeDecodersSequence
-from litestar.types.builtin_types import NoneType
-from litestar.utils import is_class_and_subclass
-
-from .base import HTTPRouteHandler
-
-if TYPE_CHECKING:
- from typing import Any, Mapping, Sequence
-
- from litestar.background_tasks import BackgroundTask, BackgroundTasks
- from litestar.config.response_cache import CACHE_FOREVER
- from litestar.connection import Request
- from litestar.datastructures import CacheControlHeader, ETag
- from litestar.dto import AbstractDTO
- from litestar.openapi.datastructures import ResponseSpec
- from litestar.openapi.spec import SecurityRequirement
- from litestar.response import Response
- from litestar.types import (
- AfterRequestHookHandler,
- AfterResponseHookHandler,
- BeforeRequestHookHandler,
- CacheKeyBuilder,
- Dependencies,
- EmptyType,
- ExceptionHandlersMap,
- Guard,
- Middleware,
- ResponseCookies,
- ResponseHeaders,
- TypeEncodersMap,
- )
- from litestar.types.callable_types import OperationIDCreator
-
-
-__all__ = ("get", "head", "post", "put", "patch", "delete")
-
-MSG_SEMANTIC_ROUTE_HANDLER_WITH_HTTP = "semantic route handlers cannot define http_method"
-
-
-class delete(HTTPRouteHandler):
- """DELETE Route Decorator.
-
- Use this decorator to decorate an HTTP handler for DELETE requests.
- """
-
- def __init__(
- self,
- path: str | None | Sequence[str] = None,
- *,
- after_request: AfterRequestHookHandler | None = None,
- after_response: AfterResponseHookHandler | None = None,
- background: BackgroundTask | BackgroundTasks | None = None,
- before_request: BeforeRequestHookHandler | None = None,
- cache: bool | int | type[CACHE_FOREVER] = False,
- cache_control: CacheControlHeader | None = None,
- cache_key_builder: CacheKeyBuilder | None = None,
- dependencies: Dependencies | None = None,
- dto: type[AbstractDTO] | None | EmptyType = Empty,
- etag: ETag | None = None,
- exception_handlers: ExceptionHandlersMap | None = None,
- guards: Sequence[Guard] | None = None,
- media_type: MediaType | str | None = None,
- middleware: Sequence[Middleware] | None = None,
- name: str | None = None,
- opt: Mapping[str, Any] | None = None,
- request_class: type[Request] | None = None,
- response_class: type[Response] | None = None,
- response_cookies: ResponseCookies | None = None,
- response_headers: ResponseHeaders | None = None,
- return_dto: type[AbstractDTO] | None | EmptyType = Empty,
- signature_namespace: Mapping[str, Any] | None = None,
- status_code: int | None = None,
- sync_to_thread: bool | None = None,
- # OpenAPI related attributes
- content_encoding: str | None = None,
- content_media_type: str | None = None,
- deprecated: bool = False,
- description: str | None = None,
- include_in_schema: bool | EmptyType = Empty,
- operation_class: type[Operation] = Operation,
- operation_id: str | OperationIDCreator | None = None,
- raises: Sequence[type[HTTPException]] | None = None,
- response_description: str | None = None,
- responses: Mapping[int, ResponseSpec] | None = None,
- security: Sequence[SecurityRequirement] | None = None,
- summary: str | None = None,
- tags: Sequence[str] | None = None,
- type_decoders: TypeDecodersSequence | None = None,
- type_encoders: TypeEncodersMap | None = None,
- **kwargs: Any,
- ) -> None:
- """Initialize ``delete``
-
- Args:
- path: A path fragment for the route handler function or a sequence of path fragments.
- If not given defaults to ``/``
- after_request: A sync or async function executed before a :class:`Request <.connection.Request>` is passed
- to any route handler. If this function returns a value, the request will not reach the route handler,
- and instead this value will be used.
- after_response: A sync or async function called after the response has been awaited. It receives the
- :class:`Request <.connection.Request>` object and should not return any values.
- background: A :class:`BackgroundTask <.background_tasks.BackgroundTask>` instance or
- :class:`BackgroundTasks <.background_tasks.BackgroundTasks>` to execute after the response is finished.
- Defaults to ``None``.
- before_request: A sync or async function called immediately before calling the route handler. Receives
- the :class:`.connection.Request` instance and any non-``None`` return value is used for the response,
- bypassing the route handler.
- cache: Enables response caching if configured on the application level. Valid values are ``True`` or a number
- of seconds (e.g. ``120``) to cache the response.
- cache_control: A ``cache-control`` header of type
- :class:`CacheControlHeader <.datastructures.CacheControlHeader>` that will be added to the response.
- cache_key_builder: A :class:`cache-key builder function <.types.CacheKeyBuilder>`. Allows for customization
- of the cache key if caching is configured on the application level.
- dto: :class:`AbstractDTO <.dto.base_dto.AbstractDTO>` to use for (de)serializing and
- validation of request data.
- dependencies: A string keyed mapping of dependency :class:`Provider <.di.Provide>` instances.
- etag: An ``etag`` header of type :class:`ETag <.datastructures.ETag>` that will be added to the response.
- exception_handlers: A mapping of status codes and/or exception types to handler functions.
- guards: A sequence of :class:`Guard <.types.Guard>` callables.
- http_method: An :class:`http method string <.types.Method>`, a member of the enum
- :class:`HttpMethod <litestar.enums.HttpMethod>` or a list of these that correlates to the methods the
- route handler function should handle.
- media_type: A member of the :class:`MediaType <.enums.MediaType>` enum or a string with a
- valid IANA Media-Type.
- middleware: A sequence of :class:`Middleware <.types.Middleware>`.
- name: A string identifying the route handler.
- opt: A string keyed mapping of arbitrary values that can be accessed in :class:`Guards <.types.Guard>` or
- wherever you have access to :class:`Request <.connection.Request>` or :class:`ASGI Scope <.types.Scope>`.
- request_class: A custom subclass of :class:`Request <.connection.Request>` to be used as route handler's
- default request.
- response_class: A custom subclass of :class:`Response <.response.Response>` to be used as route handler's
- default response.
- response_cookies: A sequence of :class:`Cookie <.datastructures.Cookie>` instances.
- response_headers: A string keyed mapping of :class:`ResponseHeader <.datastructures.ResponseHeader>`
- instances.
- responses: A mapping of additional status codes and a description of their expected content.
- This information will be included in the OpenAPI schema
- return_dto: :class:`AbstractDTO <.dto.base_dto.AbstractDTO>` to use for serializing
- outbound response data.
- signature_namespace: A mapping of names to types for use in forward reference resolution during signature modelling.
- status_code: An http status code for the response. Defaults to ``200`` for mixed method or ``GET``, ``PUT``
- and ``PATCH``, ``201`` for ``POST`` and ``204`` for ``DELETE``.
- sync_to_thread: A boolean dictating whether the handler function will be executed in a worker thread or the
- main event loop. This has an effect only for sync handler functions. See using sync handler functions.
- content_encoding: A string describing the encoding of the content, e.g. ``base64``.
- content_media_type: A string designating the media-type of the content, e.g. ``image/png``.
- deprecated: A boolean dictating whether this route should be marked as deprecated in the OpenAPI schema.
- description: Text used for the route's schema description section.
- include_in_schema: A boolean flag dictating whether the route handler should be documented in the OpenAPI schema.
- operation_class: :class:`Operation <.openapi.spec.operation.Operation>` to be used with the route's OpenAPI schema.
- operation_id: Either a string or a callable returning a string. An identifier used for the route's schema operationId.
- raises: A list of exception classes extending from litestar.HttpException that is used for the OpenAPI documentation.
- This list should describe all exceptions raised within the route handler's function/method. The Litestar
- ValidationException will be added automatically for the schema if any validation is involved.
- response_description: Text used for the route's response schema description section.
- security: A sequence of dictionaries that contain information about which security scheme can be used on the endpoint.
- summary: Text used for the route's schema summary section.
- tags: A sequence of string tags that will be appended to the OpenAPI schema.
- type_decoders: A sequence of tuples, each composed of a predicate testing for type identity and a msgspec
- hook for deserialization.
- type_encoders: A mapping of types to callables that transform them into types supported for serialization.
- **kwargs: Any additional kwarg - will be set in the opt dictionary.
- """
- if "http_method" in kwargs:
- raise ImproperlyConfiguredException(MSG_SEMANTIC_ROUTE_HANDLER_WITH_HTTP)
- super().__init__(
- after_request=after_request,
- after_response=after_response,
- background=background,
- before_request=before_request,
- cache=cache,
- cache_control=cache_control,
- cache_key_builder=cache_key_builder,
- content_encoding=content_encoding,
- content_media_type=content_media_type,
- dependencies=dependencies,
- deprecated=deprecated,
- description=description,
- dto=dto,
- etag=etag,
- exception_handlers=exception_handlers,
- guards=guards,
- http_method=HttpMethod.DELETE,
- include_in_schema=include_in_schema,
- media_type=media_type,
- middleware=middleware,
- name=name,
- operation_class=operation_class,
- operation_id=operation_id,
- opt=opt,
- path=path,
- raises=raises,
- request_class=request_class,
- response_class=response_class,
- response_cookies=response_cookies,
- response_description=response_description,
- response_headers=response_headers,
- responses=responses,
- return_dto=return_dto,
- security=security,
- signature_namespace=signature_namespace,
- status_code=status_code,
- summary=summary,
- sync_to_thread=sync_to_thread,
- tags=tags,
- type_decoders=type_decoders,
- type_encoders=type_encoders,
- **kwargs,
- )
-
-
-class get(HTTPRouteHandler):
- """GET Route Decorator.
-
- Use this decorator to decorate an HTTP handler for GET requests.
- """
-
- def __init__(
- self,
- path: str | None | Sequence[str] = None,
- *,
- after_request: AfterRequestHookHandler | None = None,
- after_response: AfterResponseHookHandler | None = None,
- background: BackgroundTask | BackgroundTasks | None = None,
- before_request: BeforeRequestHookHandler | None = None,
- cache: bool | int | type[CACHE_FOREVER] = False,
- cache_control: CacheControlHeader | None = None,
- cache_key_builder: CacheKeyBuilder | None = None,
- dependencies: Dependencies | None = None,
- dto: type[AbstractDTO] | None | EmptyType = Empty,
- etag: ETag | None = None,
- exception_handlers: ExceptionHandlersMap | None = None,
- guards: Sequence[Guard] | None = None,
- media_type: MediaType | str | None = None,
- middleware: Sequence[Middleware] | None = None,
- name: str | None = None,
- opt: Mapping[str, Any] | None = None,
- request_class: type[Request] | None = None,
- response_class: type[Response] | None = None,
- response_cookies: ResponseCookies | None = None,
- response_headers: ResponseHeaders | None = None,
- return_dto: type[AbstractDTO] | None | EmptyType = Empty,
- signature_namespace: Mapping[str, Any] | None = None,
- status_code: int | None = None,
- sync_to_thread: bool | None = None,
- # OpenAPI related attributes
- content_encoding: str | None = None,
- content_media_type: str | None = None,
- deprecated: bool = False,
- description: str | None = None,
- include_in_schema: bool | EmptyType = Empty,
- operation_class: type[Operation] = Operation,
- operation_id: str | OperationIDCreator | None = None,
- raises: Sequence[type[HTTPException]] | None = None,
- response_description: str | None = None,
- responses: Mapping[int, ResponseSpec] | None = None,
- security: Sequence[SecurityRequirement] | None = None,
- summary: str | None = None,
- tags: Sequence[str] | None = None,
- type_decoders: TypeDecodersSequence | None = None,
- type_encoders: TypeEncodersMap | None = None,
- **kwargs: Any,
- ) -> None:
- """Initialize ``get``.
-
- Args:
- path: A path fragment for the route handler function or a sequence of path fragments.
- If not given defaults to ``/``
- after_request: A sync or async function executed before a :class:`Request <.connection.Request>` is passed
- to any route handler. If this function returns a value, the request will not reach the route handler,
- and instead this value will be used.
- after_response: A sync or async function called after the response has been awaited. It receives the
- :class:`Request <.connection.Request>` object and should not return any values.
- background: A :class:`BackgroundTask <.background_tasks.BackgroundTask>` instance or
- :class:`BackgroundTasks <.background_tasks.BackgroundTasks>` to execute after the response is finished.
- Defaults to ``None``.
- before_request: A sync or async function called immediately before calling the route handler. Receives
- the :class:`.connection.Request` instance and any non-``None`` return value is used for the response,
- bypassing the route handler.
- cache: Enables response caching if configured on the application level. Valid values are ``True`` or a number
- of seconds (e.g. ``120``) to cache the response.
- cache_control: A ``cache-control`` header of type
- :class:`CacheControlHeader <.datastructures.CacheControlHeader>` that will be added to the response.
- cache_key_builder: A :class:`cache-key builder function <.types.CacheKeyBuilder>`. Allows for customization
- of the cache key if caching is configured on the application level.
- dependencies: A string keyed mapping of dependency :class:`Provider <.di.Provide>` instances.
- dto: :class:`AbstractDTO <.dto.base_dto.AbstractDTO>` to use for (de)serializing and
- validation of request data.
- etag: An ``etag`` header of type :class:`ETag <.datastructures.ETag>` that will be added to the response.
- exception_handlers: A mapping of status codes and/or exception types to handler functions.
- guards: A sequence of :class:`Guard <.types.Guard>` callables.
- http_method: An :class:`http method string <.types.Method>`, a member of the enum
- :class:`HttpMethod <litestar.enums.HttpMethod>` or a list of these that correlates to the methods the
- route handler function should handle.
- media_type: A member of the :class:`MediaType <.enums.MediaType>` enum or a string with a
- valid IANA Media-Type.
- middleware: A sequence of :class:`Middleware <.types.Middleware>`.
- name: A string identifying the route handler.
- opt: A string keyed mapping of arbitrary values that can be accessed in :class:`Guards <.types.Guard>` or
- wherever you have access to :class:`Request <.connection.Request>` or :class:`ASGI Scope <.types.Scope>`.
- request_class: A custom subclass of :class:`Request <.connection.Request>` to be used as route handler's
- default request.
- response_class: A custom subclass of :class:`Response <.response.Response>` to be used as route handler's
- default response.
- response_cookies: A sequence of :class:`Cookie <.datastructures.Cookie>` instances.
- response_headers: A string keyed mapping of :class:`ResponseHeader <.datastructures.ResponseHeader>`
- instances.
- responses: A mapping of additional status codes and a description of their expected content.
- This information will be included in the OpenAPI schema
- return_dto: :class:`AbstractDTO <.dto.base_dto.AbstractDTO>` to use for serializing
- outbound response data.
- signature_namespace: A mapping of names to types for use in forward reference resolution during signature modelling.
- status_code: An http status code for the response. Defaults to ``200`` for mixed method or ``GET``, ``PUT`` and
- ``PATCH``, ``201`` for ``POST`` and ``204`` for ``DELETE``.
- sync_to_thread: A boolean dictating whether the handler function will be executed in a worker thread or the
- main event loop. This has an effect only for sync handler functions. See using sync handler functions.
- content_encoding: A string describing the encoding of the content, e.g. ``base64``.
- content_media_type: A string designating the media-type of the content, e.g. ``image/png``.
- deprecated: A boolean dictating whether this route should be marked as deprecated in the OpenAPI schema.
- description: Text used for the route's schema description section.
- include_in_schema: A boolean flag dictating whether the route handler should be documented in the OpenAPI schema.
- operation_class: :class:`Operation <.openapi.spec.operation.Operation>` to be used with the route's OpenAPI schema.
- operation_id: Either a string or a callable returning a string. An identifier used for the route's schema operationId.
- raises: A list of exception classes extending from litestar.HttpException that is used for the OpenAPI documentation.
- This list should describe all exceptions raised within the route handler's function/method. The Litestar
- ValidationException will be added automatically for the schema if any validation is involved.
- response_description: Text used for the route's response schema description section.
- security: A sequence of dictionaries that contain information about which security scheme can be used on the endpoint.
- summary: Text used for the route's schema summary section.
- tags: A sequence of string tags that will be appended to the OpenAPI schema.
- type_decoders: A sequence of tuples, each composed of a predicate testing for type identity and a msgspec
- hook for deserialization.
- type_encoders: A mapping of types to callables that transform them into types supported for serialization.
- **kwargs: Any additional kwarg - will be set in the opt dictionary.
- """
- if "http_method" in kwargs:
- raise ImproperlyConfiguredException(MSG_SEMANTIC_ROUTE_HANDLER_WITH_HTTP)
-
- super().__init__(
- after_request=after_request,
- after_response=after_response,
- background=background,
- before_request=before_request,
- cache=cache,
- cache_control=cache_control,
- cache_key_builder=cache_key_builder,
- content_encoding=content_encoding,
- content_media_type=content_media_type,
- dependencies=dependencies,
- deprecated=deprecated,
- description=description,
- dto=dto,
- etag=etag,
- exception_handlers=exception_handlers,
- guards=guards,
- http_method=HttpMethod.GET,
- include_in_schema=include_in_schema,
- media_type=media_type,
- middleware=middleware,
- name=name,
- operation_class=operation_class,
- operation_id=operation_id,
- opt=opt,
- path=path,
- raises=raises,
- request_class=request_class,
- response_class=response_class,
- response_cookies=response_cookies,
- response_description=response_description,
- response_headers=response_headers,
- responses=responses,
- return_dto=return_dto,
- security=security,
- signature_namespace=signature_namespace,
- status_code=status_code,
- summary=summary,
- sync_to_thread=sync_to_thread,
- tags=tags,
- type_decoders=type_decoders,
- type_encoders=type_encoders,
- **kwargs,
- )
-
-
-class head(HTTPRouteHandler):
- """HEAD Route Decorator.
-
- Use this decorator to decorate an HTTP handler for HEAD requests.
- """
-
- def __init__(
- self,
- path: str | None | Sequence[str] = None,
- *,
- after_request: AfterRequestHookHandler | None = None,
- after_response: AfterResponseHookHandler | None = None,
- background: BackgroundTask | BackgroundTasks | None = None,
- before_request: BeforeRequestHookHandler | None = None,
- cache: bool | int | type[CACHE_FOREVER] = False,
- cache_control: CacheControlHeader | None = None,
- cache_key_builder: CacheKeyBuilder | None = None,
- dependencies: Dependencies | None = None,
- dto: type[AbstractDTO] | None | EmptyType = Empty,
- etag: ETag | None = None,
- exception_handlers: ExceptionHandlersMap | None = None,
- guards: Sequence[Guard] | None = None,
- media_type: MediaType | str | None = None,
- middleware: Sequence[Middleware] | None = None,
- name: str | None = None,
- opt: Mapping[str, Any] | None = None,
- request_class: type[Request] | None = None,
- response_class: type[Response] | None = None,
- response_cookies: ResponseCookies | None = None,
- response_headers: ResponseHeaders | None = None,
- signature_namespace: Mapping[str, Any] | None = None,
- status_code: int | None = None,
- sync_to_thread: bool | None = None,
- # OpenAPI related attributes
- content_encoding: str | None = None,
- content_media_type: str | None = None,
- deprecated: bool = False,
- description: str | None = None,
- include_in_schema: bool | EmptyType = Empty,
- operation_class: type[Operation] = Operation,
- operation_id: str | OperationIDCreator | None = None,
- raises: Sequence[type[HTTPException]] | None = None,
- response_description: str | None = None,
- responses: Mapping[int, ResponseSpec] | None = None,
- return_dto: type[AbstractDTO] | None | EmptyType = Empty,
- security: Sequence[SecurityRequirement] | None = None,
- summary: str | None = None,
- tags: Sequence[str] | None = None,
- type_decoders: TypeDecodersSequence | None = None,
- type_encoders: TypeEncodersMap | None = None,
- **kwargs: Any,
- ) -> None:
- """Initialize ``head``.
-
- Notes:
- - A response to a head request cannot include a body.
- See: [MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/HEAD).
-
- Args:
- path: A path fragment for the route handler function or a sequence of path fragments.
- If not given defaults to ``/``
- after_request: A sync or async function executed before a :class:`Request <.connection.Request>` is passed
- to any route handler. If this function returns a value, the request will not reach the route handler,
- and instead this value will be used.
- after_response: A sync or async function called after the response has been awaited. It receives the
- :class:`Request <.connection.Request>` object and should not return any values.
- background: A :class:`BackgroundTask <.background_tasks.BackgroundTask>` instance or
- :class:`BackgroundTasks <.background_tasks.BackgroundTasks>` to execute after the response is finished.
- Defaults to ``None``.
- before_request: A sync or async function called immediately before calling the route handler. Receives
- the :class:`.connection.Request` instance and any non-``None`` return value is used for the response,
- bypassing the route handler.
- cache: Enables response caching if configured on the application level. Valid values are ``True`` or a number
- of seconds (e.g. ``120``) to cache the response.
- cache_control: A ``cache-control`` header of type
- :class:`CacheControlHeader <.datastructures.CacheControlHeader>` that will be added to the response.
- cache_key_builder: A :class:`cache-key builder function <.types.CacheKeyBuilder>`. Allows for customization
- of the cache key if caching is configured on the application level.
- dependencies: A string keyed mapping of dependency :class:`Provider <.di.Provide>` instances.
- dto: :class:`AbstractDTO <.dto.base_dto.AbstractDTO>` to use for (de)serializing and
- validation of request data.
- etag: An ``etag`` header of type :class:`ETag <.datastructures.ETag>` that will be added to the response.
- exception_handlers: A mapping of status codes and/or exception types to handler functions.
- guards: A sequence of :class:`Guard <.types.Guard>` callables.
- http_method: An :class:`http method string <.types.Method>`, a member of the enum
- :class:`HttpMethod <litestar.enums.HttpMethod>` or a list of these that correlates to the methods the
- route handler function should handle.
- media_type: A member of the :class:`MediaType <.enums.MediaType>` enum or a string with a
- valid IANA Media-Type.
- middleware: A sequence of :class:`Middleware <.types.Middleware>`.
- name: A string identifying the route handler.
- opt: A string keyed mapping of arbitrary values that can be accessed in :class:`Guards <.types.Guard>` or
- wherever you have access to :class:`Request <.connection.Request>` or :class:`ASGI Scope <.types.Scope>`.
- request_class: A custom subclass of :class:`Request <.connection.Request>` to be used as route handler's
- default request.
- response_class: A custom subclass of :class:`Response <.response.Response>` to be used as route handler's
- default response.
- response_cookies: A sequence of :class:`Cookie <.datastructures.Cookie>` instances.
- response_headers: A string keyed mapping of :class:`ResponseHeader <.datastructures.ResponseHeader>`
- instances.
- responses: A mapping of additional status codes and a description of their expected content.
- This information will be included in the OpenAPI schema
- return_dto: :class:`AbstractDTO <.dto.base_dto.AbstractDTO>` to use for serializing
- outbound response data.
- signature_namespace: A mapping of names to types for use in forward reference resolution during signature modelling.
- status_code: An http status code for the response. Defaults to ``200`` for mixed method or ``GET``, ``PUT`` and
- ``PATCH``, ``201`` for ``POST`` and ``204`` for ``DELETE``.
- sync_to_thread: A boolean dictating whether the handler function will be executed in a worker thread or the
- main event loop. This has an effect only for sync handler functions. See using sync handler functions.
- content_encoding: A string describing the encoding of the content, e.g. ``base64``.
- content_media_type: A string designating the media-type of the content, e.g. ``image/png``.
- deprecated: A boolean dictating whether this route should be marked as deprecated in the OpenAPI schema.
- description: Text used for the route's schema description section.
- include_in_schema: A boolean flag dictating whether the route handler should be documented in the OpenAPI schema.
- operation_class: :class:`Operation <.openapi.spec.operation.Operation>` to be used with the route's OpenAPI schema.
- operation_id: Either a string or a callable returning a string. An identifier used for the route's schema operationId.
- raises: A list of exception classes extending from litestar.HttpException that is used for the OpenAPI documentation.
- This list should describe all exceptions raised within the route handler's function/method. The Litestar
- ValidationException will be added automatically for the schema if any validation is involved.
- response_description: Text used for the route's response schema description section.
- security: A sequence of dictionaries that contain information about which security scheme can be used on the endpoint.
- summary: Text used for the route's schema summary section.
- tags: A sequence of string tags that will be appended to the OpenAPI schema.
- type_decoders: A sequence of tuples, each composed of a predicate testing for type identity and a msgspec
- hook for deserialization.
- type_encoders: A mapping of types to callables that transform them into types supported for serialization.
- **kwargs: Any additional kwarg - will be set in the opt dictionary.
- """
- if "http_method" in kwargs:
- raise ImproperlyConfiguredException(MSG_SEMANTIC_ROUTE_HANDLER_WITH_HTTP)
-
- super().__init__(
- after_request=after_request,
- after_response=after_response,
- background=background,
- before_request=before_request,
- cache=cache,
- cache_control=cache_control,
- cache_key_builder=cache_key_builder,
- content_encoding=content_encoding,
- content_media_type=content_media_type,
- dependencies=dependencies,
- deprecated=deprecated,
- description=description,
- dto=dto,
- etag=etag,
- exception_handlers=exception_handlers,
- guards=guards,
- http_method=HttpMethod.HEAD,
- include_in_schema=include_in_schema,
- media_type=media_type,
- middleware=middleware,
- name=name,
- operation_class=operation_class,
- operation_id=operation_id,
- opt=opt,
- path=path,
- raises=raises,
- request_class=request_class,
- response_class=response_class,
- response_cookies=response_cookies,
- response_description=response_description,
- response_headers=response_headers,
- responses=responses,
- return_dto=return_dto,
- security=security,
- signature_namespace=signature_namespace,
- status_code=status_code,
- summary=summary,
- sync_to_thread=sync_to_thread,
- tags=tags,
- type_decoders=type_decoders,
- type_encoders=type_encoders,
- **kwargs,
- )
-
- def _validate_handler_function(self) -> None:
- """Validate the route handler function once it is set by inspecting its return annotations."""
- super()._validate_handler_function()
-
- # we allow here File and File because these have special setting for head responses
- return_annotation = self.parsed_fn_signature.return_type.annotation
- if not (
- return_annotation in {NoneType, None}
- or is_class_and_subclass(return_annotation, File)
- or is_class_and_subclass(return_annotation, ASGIFileResponse)
- ):
- raise ImproperlyConfiguredException("A response to a head request should not have a body")
-
-
-class patch(HTTPRouteHandler):
- """PATCH Route Decorator.
-
- Use this decorator to decorate an HTTP handler for PATCH requests.
- """
-
- def __init__(
- self,
- path: str | None | Sequence[str] = None,
- *,
- after_request: AfterRequestHookHandler | None = None,
- after_response: AfterResponseHookHandler | None = None,
- background: BackgroundTask | BackgroundTasks | None = None,
- before_request: BeforeRequestHookHandler | None = None,
- cache: bool | int | type[CACHE_FOREVER] = False,
- cache_control: CacheControlHeader | None = None,
- cache_key_builder: CacheKeyBuilder | None = None,
- dependencies: Dependencies | None = None,
- dto: type[AbstractDTO] | None | EmptyType = Empty,
- etag: ETag | None = None,
- exception_handlers: ExceptionHandlersMap | None = None,
- guards: Sequence[Guard] | None = None,
- media_type: MediaType | str | None = None,
- middleware: Sequence[Middleware] | None = None,
- name: str | None = None,
- opt: Mapping[str, Any] | None = None,
- request_class: type[Request] | None = None,
- response_class: type[Response] | None = None,
- response_cookies: ResponseCookies | None = None,
- response_headers: ResponseHeaders | None = None,
- return_dto: type[AbstractDTO] | None | EmptyType = Empty,
- signature_namespace: Mapping[str, Any] | None = None,
- status_code: int | None = None,
- sync_to_thread: bool | None = None,
- # OpenAPI related attributes
- content_encoding: str | None = None,
- content_media_type: str | None = None,
- deprecated: bool = False,
- description: str | None = None,
- include_in_schema: bool | EmptyType = Empty,
- operation_class: type[Operation] = Operation,
- operation_id: str | OperationIDCreator | None = None,
- raises: Sequence[type[HTTPException]] | None = None,
- response_description: str | None = None,
- responses: Mapping[int, ResponseSpec] | None = None,
- security: Sequence[SecurityRequirement] | None = None,
- summary: str | None = None,
- tags: Sequence[str] | None = None,
- type_decoders: TypeDecodersSequence | None = None,
- type_encoders: TypeEncodersMap | None = None,
- **kwargs: Any,
- ) -> None:
- """Initialize ``patch``.
-
- Args:
- path: A path fragment for the route handler function or a sequence of path fragments.
- If not given defaults to ``/``
- after_request: A sync or async function executed before a :class:`Request <.connection.Request>` is passed
- to any route handler. If this function returns a value, the request will not reach the route handler,
- and instead this value will be used.
- after_response: A sync or async function called after the response has been awaited. It receives the
- :class:`Request <.connection.Request>` object and should not return any values.
- background: A :class:`BackgroundTask <.background_tasks.BackgroundTask>` instance or
- :class:`BackgroundTasks <.background_tasks.BackgroundTasks>` to execute after the response is finished.
- Defaults to ``None``.
- before_request: A sync or async function called immediately before calling the route handler. Receives
- the :class:`.connection.Request` instance and any non-``None`` return value is used for the response,
- bypassing the route handler.
- cache: Enables response caching if configured on the application level. Valid values are ``True`` or a number
- of seconds (e.g. ``120``) to cache the response.
- cache_control: A ``cache-control`` header of type
- :class:`CacheControlHeader <.datastructures.CacheControlHeader>` that will be added to the response.
- cache_key_builder: A :class:`cache-key builder function <.types.CacheKeyBuilder>`. Allows for customization
- of the cache key if caching is configured on the application level.
- dependencies: A string keyed mapping of dependency :class:`Provider <.di.Provide>` instances.
- dto: :class:`AbstractDTO <.dto.base_dto.AbstractDTO>` to use for (de)serializing and
- validation of request data.
- etag: An ``etag`` header of type :class:`ETag <.datastructures.ETag>` that will be added to the response.
- exception_handlers: A mapping of status codes and/or exception types to handler functions.
- guards: A sequence of :class:`Guard <.types.Guard>` callables.
- http_method: An :class:`http method string <.types.Method>`, a member of the enum
- :class:`HttpMethod <litestar.enums.HttpMethod>` or a list of these that correlates to the methods the
- route handler function should handle.
- media_type: A member of the :class:`MediaType <.enums.MediaType>` enum or a string with a
- valid IANA Media-Type.
- middleware: A sequence of :class:`Middleware <.types.Middleware>`.
- name: A string identifying the route handler.
- opt: A string keyed mapping of arbitrary values that can be accessed in :class:`Guards <.types.Guard>` or
- wherever you have access to :class:`Request <.connection.Request>` or :class:`ASGI Scope <.types.Scope>`.
- request_class: A custom subclass of :class:`Request <.connection.Request>` to be used as route handler's
- default request.
- response_class: A custom subclass of :class:`Response <.response.Response>` to be used as route handler's
- default response.
- response_cookies: A sequence of :class:`Cookie <.datastructures.Cookie>` instances.
- response_headers: A string keyed mapping of :class:`ResponseHeader <.datastructures.ResponseHeader>`
- instances.
- responses: A mapping of additional status codes and a description of their expected content.
- This information will be included in the OpenAPI schema
- return_dto: :class:`AbstractDTO <.dto.base_dto.AbstractDTO>` to use for serializing
- outbound response data.
- signature_namespace: A mapping of names to types for use in forward reference resolution during signature modelling.
- status_code: An http status code for the response. Defaults to ``200`` for mixed method or ``GET``, ``PUT`` and
- ``PATCH``, ``201`` for ``POST`` and ``204`` for ``DELETE``.
- sync_to_thread: A boolean dictating whether the handler function will be executed in a worker thread or the
- main event loop. This has an effect only for sync handler functions. See using sync handler functions.
- content_encoding: A string describing the encoding of the content, e.g. ``base64``.
- content_media_type: A string designating the media-type of the content, e.g. ``image/png``.
- deprecated: A boolean dictating whether this route should be marked as deprecated in the OpenAPI schema.
- description: Text used for the route's schema description section.
- include_in_schema: A boolean flag dictating whether the route handler should be documented in the OpenAPI schema.
- operation_class: :class:`Operation <.openapi.spec.operation.Operation>` to be used with the route's OpenAPI schema.
- operation_id: Either a string or a callable returning a string. An identifier used for the route's schema operationId.
- raises: A list of exception classes extending from litestar.HttpException that is used for the OpenAPI documentation.
- This list should describe all exceptions raised within the route handler's function/method. The Litestar
- ValidationException will be added automatically for the schema if any validation is involved.
- response_description: Text used for the route's response schema description section.
- security: A sequence of dictionaries that contain information about which security scheme can be used on the endpoint.
- summary: Text used for the route's schema summary section.
- tags: A sequence of string tags that will be appended to the OpenAPI schema.
- type_decoders: A sequence of tuples, each composed of a predicate testing for type identity and a msgspec
- hook for deserialization.
- type_encoders: A mapping of types to callables that transform them into types supported for serialization.
- **kwargs: Any additional kwarg - will be set in the opt dictionary.
- """
- if "http_method" in kwargs:
- raise ImproperlyConfiguredException(MSG_SEMANTIC_ROUTE_HANDLER_WITH_HTTP)
- super().__init__(
- after_request=after_request,
- after_response=after_response,
- background=background,
- before_request=before_request,
- cache=cache,
- cache_control=cache_control,
- cache_key_builder=cache_key_builder,
- content_encoding=content_encoding,
- content_media_type=content_media_type,
- dependencies=dependencies,
- deprecated=deprecated,
- description=description,
- dto=dto,
- etag=etag,
- exception_handlers=exception_handlers,
- guards=guards,
- http_method=HttpMethod.PATCH,
- include_in_schema=include_in_schema,
- media_type=media_type,
- middleware=middleware,
- name=name,
- operation_class=operation_class,
- operation_id=operation_id,
- opt=opt,
- path=path,
- raises=raises,
- request_class=request_class,
- response_class=response_class,
- response_cookies=response_cookies,
- response_description=response_description,
- response_headers=response_headers,
- responses=responses,
- return_dto=return_dto,
- security=security,
- signature_namespace=signature_namespace,
- status_code=status_code,
- summary=summary,
- sync_to_thread=sync_to_thread,
- tags=tags,
- type_decoders=type_decoders,
- type_encoders=type_encoders,
- **kwargs,
- )
-
-
-class post(HTTPRouteHandler):
- """POST Route Decorator.
-
- Use this decorator to decorate an HTTP handler for POST requests.
- """
-
- def __init__(
- self,
- path: str | None | Sequence[str] = None,
- *,
- after_request: AfterRequestHookHandler | None = None,
- after_response: AfterResponseHookHandler | None = None,
- background: BackgroundTask | BackgroundTasks | None = None,
- before_request: BeforeRequestHookHandler | None = None,
- cache: bool | int | type[CACHE_FOREVER] = False,
- cache_control: CacheControlHeader | None = None,
- cache_key_builder: CacheKeyBuilder | None = None,
- dependencies: Dependencies | None = None,
- dto: type[AbstractDTO] | None | EmptyType = Empty,
- etag: ETag | None = None,
- exception_handlers: ExceptionHandlersMap | None = None,
- guards: Sequence[Guard] | None = None,
- media_type: MediaType | str | None = None,
- middleware: Sequence[Middleware] | None = None,
- name: str | None = None,
- opt: Mapping[str, Any] | None = None,
- request_class: type[Request] | None = None,
- response_class: type[Response] | None = None,
- response_cookies: ResponseCookies | None = None,
- response_headers: ResponseHeaders | None = None,
- return_dto: type[AbstractDTO] | None | EmptyType = Empty,
- signature_namespace: Mapping[str, Any] | None = None,
- status_code: int | None = None,
- sync_to_thread: bool | None = None,
- # OpenAPI related attributes
- content_encoding: str | None = None,
- content_media_type: str | None = None,
- deprecated: bool = False,
- description: str | None = None,
- include_in_schema: bool | EmptyType = Empty,
- operation_class: type[Operation] = Operation,
- operation_id: str | OperationIDCreator | None = None,
- raises: Sequence[type[HTTPException]] | None = None,
- response_description: str | None = None,
- responses: Mapping[int, ResponseSpec] | None = None,
- security: Sequence[SecurityRequirement] | None = None,
- summary: str | None = None,
- tags: Sequence[str] | None = None,
- type_decoders: TypeDecodersSequence | None = None,
- type_encoders: TypeEncodersMap | None = None,
- **kwargs: Any,
- ) -> None:
- """Initialize ``post``
-
- Args:
- path: A path fragment for the route handler function or a sequence of path fragments.
- If not given defaults to ``/``
- after_request: A sync or async function executed before a :class:`Request <.connection.Request>` is passed
- to any route handler. If this function returns a value, the request will not reach the route handler,
- and instead this value will be used.
- after_response: A sync or async function called after the response has been awaited. It receives the
- :class:`Request <.connection.Request>` object and should not return any values.
- background: A :class:`BackgroundTask <.background_tasks.BackgroundTask>` instance or
- :class:`BackgroundTasks <.background_tasks.BackgroundTasks>` to execute after the response is finished.
- Defaults to ``None``.
- before_request: A sync or async function called immediately before calling the route handler. Receives
- the :class:`.connection.Request` instance and any non-``None`` return value is used for the response,
- bypassing the route handler.
- cache: Enables response caching if configured on the application level. Valid values are ``True`` or a number
- of seconds (e.g. ``120``) to cache the response.
- cache_control: A ``cache-control`` header of type
- :class:`CacheControlHeader <.datastructures.CacheControlHeader>` that will be added to the response.
- cache_key_builder: A :class:`cache-key builder function <.types.CacheKeyBuilder>`. Allows for customization
- of the cache key if caching is configured on the application level.
- dependencies: A string keyed mapping of dependency :class:`Provider <.di.Provide>` instances.
- dto: :class:`AbstractDTO <.dto.base_dto.AbstractDTO>` to use for (de)serializing and
- validation of request data.
- etag: An ``etag`` header of type :class:`ETag <.datastructures.ETag>` that will be added to the response.
- exception_handlers: A mapping of status codes and/or exception types to handler functions.
- guards: A sequence of :class:`Guard <.types.Guard>` callables.
- http_method: An :class:`http method string <.types.Method>`, a member of the enum
- :class:`HttpMethod <litestar.enums.HttpMethod>` or a list of these that correlates to the methods the
- route handler function should handle.
- media_type: A member of the :class:`MediaType <.enums.MediaType>` enum or a string with a
- valid IANA Media-Type.
- middleware: A sequence of :class:`Middleware <.types.Middleware>`.
- name: A string identifying the route handler.
- opt: A string keyed mapping of arbitrary values that can be accessed in :class:`Guards <.types.Guard>` or
- wherever you have access to :class:`Request <.connection.Request>` or :class:`ASGI Scope <.types.Scope>`.
- request_class: A custom subclass of :class:`Request <.connection.Request>` to be used as route handler's
- default request.
- response_class: A custom subclass of :class:`Response <.response.Response>` to be used as route handler's
- default response.
- response_cookies: A sequence of :class:`Cookie <.datastructures.Cookie>` instances.
- response_headers: A string keyed mapping of :class:`ResponseHeader <.datastructures.ResponseHeader>`
- instances.
- responses: A mapping of additional status codes and a description of their expected content.
- This information will be included in the OpenAPI schema
- return_dto: :class:`AbstractDTO <.dto.base_dto.AbstractDTO>` to use for serializing
- outbound response data.
- signature_namespace: A mapping of names to types for use in forward reference resolution during signature modelling.
- status_code: An http status code for the response. Defaults to ``200`` for mixed method or ``GET``, ``PUT`` and
- ``PATCH``, ``201`` for ``POST`` and ``204`` for ``DELETE``.
- sync_to_thread: A boolean dictating whether the handler function will be executed in a worker thread or the
- main event loop. This has an effect only for sync handler functions. See using sync handler functions.
- content_encoding: A string describing the encoding of the content, e.g. ``base64``.
- content_media_type: A string designating the media-type of the content, e.g. ``image/png``.
- deprecated: A boolean dictating whether this route should be marked as deprecated in the OpenAPI schema.
- description: Text used for the route's schema description section.
- include_in_schema: A boolean flag dictating whether the route handler should be documented in the OpenAPI schema.
- operation_class: :class:`Operation <.openapi.spec.operation.Operation>` to be used with the route's OpenAPI schema.
- operation_id: Either a string or a callable returning a string. An identifier used for the route's schema operationId.
- raises: A list of exception classes extending from litestar.HttpException that is used for the OpenAPI documentation.
- This list should describe all exceptions raised within the route handler's function/method. The Litestar
- ValidationException will be added automatically for the schema if any validation is involved.
- response_description: Text used for the route's response schema description section.
- security: A sequence of dictionaries that contain information about which security scheme can be used on the endpoint.
- summary: Text used for the route's schema summary section.
- tags: A sequence of string tags that will be appended to the OpenAPI schema.
- type_decoders: A sequence of tuples, each composed of a predicate testing for type identity and a msgspec
- hook for deserialization.
- type_encoders: A mapping of types to callables that transform them into types supported for serialization.
- **kwargs: Any additional kwarg - will be set in the opt dictionary.
- """
- if "http_method" in kwargs:
- raise ImproperlyConfiguredException(MSG_SEMANTIC_ROUTE_HANDLER_WITH_HTTP)
- super().__init__(
- after_request=after_request,
- after_response=after_response,
- background=background,
- before_request=before_request,
- cache=cache,
- cache_control=cache_control,
- cache_key_builder=cache_key_builder,
- content_encoding=content_encoding,
- content_media_type=content_media_type,
- dependencies=dependencies,
- deprecated=deprecated,
- description=description,
- dto=dto,
- exception_handlers=exception_handlers,
- etag=etag,
- guards=guards,
- http_method=HttpMethod.POST,
- include_in_schema=include_in_schema,
- media_type=media_type,
- middleware=middleware,
- name=name,
- operation_class=operation_class,
- operation_id=operation_id,
- opt=opt,
- path=path,
- raises=raises,
- request_class=request_class,
- response_class=response_class,
- response_cookies=response_cookies,
- response_description=response_description,
- response_headers=response_headers,
- responses=responses,
- return_dto=return_dto,
- signature_namespace=signature_namespace,
- security=security,
- status_code=status_code,
- summary=summary,
- sync_to_thread=sync_to_thread,
- tags=tags,
- type_decoders=type_decoders,
- type_encoders=type_encoders,
- **kwargs,
- )
-
-
-class put(HTTPRouteHandler):
- """PUT Route Decorator.
-
- Use this decorator to decorate an HTTP handler for PUT requests.
- """
-
- def __init__(
- self,
- path: str | None | Sequence[str] = None,
- *,
- after_request: AfterRequestHookHandler | None = None,
- after_response: AfterResponseHookHandler | None = None,
- background: BackgroundTask | BackgroundTasks | None = None,
- before_request: BeforeRequestHookHandler | None = None,
- cache: bool | int | type[CACHE_FOREVER] = False,
- cache_control: CacheControlHeader | None = None,
- cache_key_builder: CacheKeyBuilder | None = None,
- dependencies: Dependencies | None = None,
- dto: type[AbstractDTO] | None | EmptyType = Empty,
- etag: ETag | None = None,
- exception_handlers: ExceptionHandlersMap | None = None,
- guards: Sequence[Guard] | None = None,
- media_type: MediaType | str | None = None,
- middleware: Sequence[Middleware] | None = None,
- name: str | None = None,
- opt: Mapping[str, Any] | None = None,
- request_class: type[Request] | None = None,
- response_class: type[Response] | None = None,
- response_cookies: ResponseCookies | None = None,
- response_headers: ResponseHeaders | None = None,
- return_dto: type[AbstractDTO] | None | EmptyType = Empty,
- signature_namespace: Mapping[str, Any] | None = None,
- status_code: int | None = None,
- sync_to_thread: bool | None = None,
- # OpenAPI related attributes
- content_encoding: str | None = None,
- content_media_type: str | None = None,
- deprecated: bool = False,
- description: str | None = None,
- include_in_schema: bool | EmptyType = Empty,
- operation_class: type[Operation] = Operation,
- operation_id: str | OperationIDCreator | None = None,
- raises: Sequence[type[HTTPException]] | None = None,
- response_description: str | None = None,
- responses: Mapping[int, ResponseSpec] | None = None,
- security: Sequence[SecurityRequirement] | None = None,
- summary: str | None = None,
- tags: Sequence[str] | None = None,
- type_decoders: TypeDecodersSequence | None = None,
- type_encoders: TypeEncodersMap | None = None,
- **kwargs: Any,
- ) -> None:
- """Initialize ``put``
-
- Args:
- path: A path fragment for the route handler function or a sequence of path fragments.
- If not given defaults to ``/``
- after_request: A sync or async function executed before a :class:`Request <.connection.Request>` is passed
- to any route handler. If this function returns a value, the request will not reach the route handler,
- and instead this value will be used.
- after_response: A sync or async function called after the response has been awaited. It receives the
- :class:`Request <.connection.Request>` object and should not return any values.
- background: A :class:`BackgroundTask <.background_tasks.BackgroundTask>` instance or
- :class:`BackgroundTasks <.background_tasks.BackgroundTasks>` to execute after the response is finished.
- Defaults to ``None``.
- before_request: A sync or async function called immediately before calling the route handler. Receives
- the :class:`.connection.Request` instance and any non-``None`` return value is used for the response,
- bypassing the route handler.
- cache: Enables response caching if configured on the application level. Valid values are ``True`` or a number
- of seconds (e.g. ``120``) to cache the response.
- cache_control: A ``cache-control`` header of type
- :class:`CacheControlHeader <.datastructures.CacheControlHeader>` that will be added to the response.
- cache_key_builder: A :class:`cache-key builder function <.types.CacheKeyBuilder>`. Allows for customization
- of the cache key if caching is configured on the application level.
- dependencies: A string keyed mapping of dependency :class:`Provider <.di.Provide>` instances.
- dto: :class:`AbstractDTO <.dto.base_dto.AbstractDTO>` to use for (de)serializing and
- validation of request data.
- etag: An ``etag`` header of type :class:`ETag <.datastructures.ETag>` that will be added to the response.
- exception_handlers: A mapping of status codes and/or exception types to handler functions.
- guards: A sequence of :class:`Guard <.types.Guard>` callables.
- http_method: An :class:`http method string <.types.Method>`, a member of the enum
- :class:`HttpMethod <litestar.enums.HttpMethod>` or a list of these that correlates to the methods the
- route handler function should handle.
- media_type: A member of the :class:`MediaType <.enums.MediaType>` enum or a string with a
- valid IANA Media-Type.
- middleware: A sequence of :class:`Middleware <.types.Middleware>`.
- name: A string identifying the route handler.
- opt: A string keyed mapping of arbitrary values that can be accessed in :class:`Guards <.types.Guard>` or
- wherever you have access to :class:`Request <.connection.Request>` or :class:`ASGI Scope <.types.Scope>`.
- request_class: A custom subclass of :class:`Request <.connection.Request>` to be used as route handler's
- default request.
- response_class: A custom subclass of :class:`Response <.response.Response>` to be used as route handler's
- default response.
- response_cookies: A sequence of :class:`Cookie <.datastructures.Cookie>` instances.
- response_headers: A string keyed mapping of :class:`ResponseHeader <.datastructures.ResponseHeader>`
- instances.
- responses: A mapping of additional status codes and a description of their expected content.
- This information will be included in the OpenAPI schema
- return_dto: :class:`AbstractDTO <.dto.base_dto.AbstractDTO>` to use for serializing
- outbound response data.
- signature_namespace: A mapping of names to types for use in forward reference resolution during signature modelling.
- status_code: An http status code for the response. Defaults to ``200`` for mixed method or ``GET``, ``PUT`` and
- ``PATCH``, ``201`` for ``POST`` and ``204`` for ``DELETE``.
- sync_to_thread: A boolean dictating whether the handler function will be executed in a worker thread or the
- main event loop. This has an effect only for sync handler functions. See using sync handler functions.
- content_encoding: A string describing the encoding of the content, e.g. ``base64``.
- content_media_type: A string designating the media-type of the content, e.g. ``image/png``.
- deprecated: A boolean dictating whether this route should be marked as deprecated in the OpenAPI schema.
- description: Text used for the route's schema description section.
- include_in_schema: A boolean flag dictating whether the route handler should be documented in the OpenAPI schema.
- operation_class: :class:`Operation <.openapi.spec.operation.Operation>` to be used with the route's OpenAPI schema.
- operation_id: Either a string or a callable returning a string. An identifier used for the route's schema operationId.
- raises: A list of exception classes extending from litestar.HttpException that is used for the OpenAPI documentation.
- This list should describe all exceptions raised within the route handler's function/method. The Litestar
- ValidationException will be added automatically for the schema if any validation is involved.
- response_description: Text used for the route's response schema description section.
- security: A sequence of dictionaries that contain information about which security scheme can be used on the endpoint.
- summary: Text used for the route's schema summary section.
- tags: A sequence of string tags that will be appended to the OpenAPI schema.
- type_decoders: A sequence of tuples, each composed of a predicate testing for type identity and a msgspec
- hook for deserialization.
- type_encoders: A mapping of types to callables that transform them into types supported for serialization.
- **kwargs: Any additional kwarg - will be set in the opt dictionary.
- """
- if "http_method" in kwargs:
- raise ImproperlyConfiguredException(MSG_SEMANTIC_ROUTE_HANDLER_WITH_HTTP)
- super().__init__(
- after_request=after_request,
- after_response=after_response,
- background=background,
- before_request=before_request,
- cache=cache,
- cache_control=cache_control,
- cache_key_builder=cache_key_builder,
- content_encoding=content_encoding,
- content_media_type=content_media_type,
- dependencies=dependencies,
- deprecated=deprecated,
- description=description,
- dto=dto,
- exception_handlers=exception_handlers,
- etag=etag,
- guards=guards,
- http_method=HttpMethod.PUT,
- include_in_schema=include_in_schema,
- media_type=media_type,
- middleware=middleware,
- name=name,
- operation_class=operation_class,
- operation_id=operation_id,
- opt=opt,
- path=path,
- raises=raises,
- request_class=request_class,
- response_class=response_class,
- response_cookies=response_cookies,
- response_description=response_description,
- response_headers=response_headers,
- responses=responses,
- return_dto=return_dto,
- security=security,
- signature_namespace=signature_namespace,
- status_code=status_code,
- summary=summary,
- sync_to_thread=sync_to_thread,
- tags=tags,
- type_decoders=type_decoders,
- type_encoders=type_encoders,
- **kwargs,
- )
diff --git a/venv/lib/python3.11/site-packages/litestar/handlers/websocket_handlers/__init__.py b/venv/lib/python3.11/site-packages/litestar/handlers/websocket_handlers/__init__.py
deleted file mode 100644
index 5b24734..0000000
--- a/venv/lib/python3.11/site-packages/litestar/handlers/websocket_handlers/__init__.py
+++ /dev/null
@@ -1,16 +0,0 @@
-from __future__ import annotations
-
-from litestar.handlers.websocket_handlers.listener import (
- WebsocketListener,
- WebsocketListenerRouteHandler,
- websocket_listener,
-)
-from litestar.handlers.websocket_handlers.route_handler import WebsocketRouteHandler, websocket
-
-__all__ = (
- "WebsocketListener",
- "WebsocketListenerRouteHandler",
- "WebsocketRouteHandler",
- "websocket",
- "websocket_listener",
-)
diff --git a/venv/lib/python3.11/site-packages/litestar/handlers/websocket_handlers/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/litestar/handlers/websocket_handlers/__pycache__/__init__.cpython-311.pyc
deleted file mode 100644
index f6d1115..0000000
--- a/venv/lib/python3.11/site-packages/litestar/handlers/websocket_handlers/__pycache__/__init__.cpython-311.pyc
+++ /dev/null
Binary files differ
diff --git a/venv/lib/python3.11/site-packages/litestar/handlers/websocket_handlers/__pycache__/_utils.cpython-311.pyc b/venv/lib/python3.11/site-packages/litestar/handlers/websocket_handlers/__pycache__/_utils.cpython-311.pyc
deleted file mode 100644
index c5ae4c8..0000000
--- a/venv/lib/python3.11/site-packages/litestar/handlers/websocket_handlers/__pycache__/_utils.cpython-311.pyc
+++ /dev/null
Binary files differ
diff --git a/venv/lib/python3.11/site-packages/litestar/handlers/websocket_handlers/__pycache__/listener.cpython-311.pyc b/venv/lib/python3.11/site-packages/litestar/handlers/websocket_handlers/__pycache__/listener.cpython-311.pyc
deleted file mode 100644
index 38b8219..0000000
--- a/venv/lib/python3.11/site-packages/litestar/handlers/websocket_handlers/__pycache__/listener.cpython-311.pyc
+++ /dev/null
Binary files differ
diff --git a/venv/lib/python3.11/site-packages/litestar/handlers/websocket_handlers/__pycache__/route_handler.cpython-311.pyc b/venv/lib/python3.11/site-packages/litestar/handlers/websocket_handlers/__pycache__/route_handler.cpython-311.pyc
deleted file mode 100644
index 0e92ccd..0000000
--- a/venv/lib/python3.11/site-packages/litestar/handlers/websocket_handlers/__pycache__/route_handler.cpython-311.pyc
+++ /dev/null
Binary files differ
diff --git a/venv/lib/python3.11/site-packages/litestar/handlers/websocket_handlers/_utils.py b/venv/lib/python3.11/site-packages/litestar/handlers/websocket_handlers/_utils.py
deleted file mode 100644
index bcd90ac..0000000
--- a/venv/lib/python3.11/site-packages/litestar/handlers/websocket_handlers/_utils.py
+++ /dev/null
@@ -1,154 +0,0 @@
-from __future__ import annotations
-
-from functools import wraps
-from inspect import Parameter, Signature
-from typing import TYPE_CHECKING, Any, Callable, Coroutine, Dict
-
-from msgspec.json import Encoder as JsonEncoder
-
-from litestar.di import Provide
-from litestar.serialization import decode_json
-from litestar.types.builtin_types import NoneType
-from litestar.utils import ensure_async_callable
-from litestar.utils.helpers import unwrap_partial
-
-if TYPE_CHECKING:
- from litestar import WebSocket
- from litestar.handlers.websocket_handlers.listener import WebsocketListenerRouteHandler
- from litestar.types import AnyCallable
- from litestar.utils.signature import ParsedSignature
-
-
-def create_handle_receive(listener: WebsocketListenerRouteHandler) -> Callable[[WebSocket], Coroutine[Any, None, None]]:
- if data_dto := listener.resolve_data_dto():
-
- async def handle_receive(socket: WebSocket) -> Any:
- received_data = await socket.receive_data(mode=listener._receive_mode)
- return data_dto(socket).decode_bytes(
- received_data.encode("utf-8") if isinstance(received_data, str) else received_data
- )
-
- elif listener.parsed_data_field and listener.parsed_data_field.annotation is str:
-
- async def handle_receive(socket: WebSocket) -> Any:
- received_data = await socket.receive_data(mode=listener._receive_mode)
- return received_data.decode("utf-8") if isinstance(received_data, bytes) else received_data
-
- elif listener.parsed_data_field and listener.parsed_data_field.annotation is bytes:
-
- async def handle_receive(socket: WebSocket) -> Any:
- received_data = await socket.receive_data(mode=listener._receive_mode)
- return received_data.encode("utf-8") if isinstance(received_data, str) else received_data
-
- else:
-
- async def handle_receive(socket: WebSocket) -> Any:
- received_data = await socket.receive_data(mode=listener._receive_mode)
- return decode_json(value=received_data, type_decoders=socket.route_handler.resolve_type_decoders())
-
- return handle_receive
-
-
-def create_handle_send(
- listener: WebsocketListenerRouteHandler,
-) -> Callable[[WebSocket, Any], Coroutine[None, None, None]]:
- json_encoder = JsonEncoder(enc_hook=listener.default_serializer)
-
- if return_dto := listener.resolve_return_dto():
-
- async def handle_send(socket: WebSocket, data: Any) -> None:
- encoded_data = return_dto(socket).data_to_encodable_type(data)
- data = json_encoder.encode(encoded_data)
- await socket.send_data(data=data, mode=listener._send_mode)
-
- elif listener.parsed_return_field.is_subclass_of((str, bytes)) or (
- listener.parsed_return_field.is_optional and listener.parsed_return_field.has_inner_subclass_of((str, bytes))
- ):
-
- async def handle_send(socket: WebSocket, data: Any) -> None:
- await socket.send_data(data=data, mode=listener._send_mode)
-
- else:
-
- async def handle_send(socket: WebSocket, data: Any) -> None:
- data = json_encoder.encode(data)
- await socket.send_data(data=data, mode=listener._send_mode)
-
- return handle_send
-
-
-class ListenerHandler:
- __slots__ = ("_can_send_data", "_fn", "_listener", "_pass_socket")
-
- def __init__(
- self,
- listener: WebsocketListenerRouteHandler,
- fn: AnyCallable,
- parsed_signature: ParsedSignature,
- namespace: dict[str, Any],
- ) -> None:
- self._can_send_data = not parsed_signature.return_type.is_subclass_of(NoneType)
- self._fn = ensure_async_callable(fn)
- self._listener = listener
- self._pass_socket = "socket" in parsed_signature.parameters
-
- async def __call__(
- self,
- *args: Any,
- socket: WebSocket,
- connection_lifespan_dependencies: Dict[str, Any], # noqa: UP006
- **kwargs: Any,
- ) -> None:
- lifespan_mananger = self._listener._connection_lifespan or self._listener.default_connection_lifespan
- handle_send = self._listener.resolve_send_handler() if self._can_send_data else None
- handle_receive = self._listener.resolve_receive_handler()
-
- if self._pass_socket:
- kwargs["socket"] = socket
-
- async with lifespan_mananger(**connection_lifespan_dependencies):
- while True:
- received_data = await handle_receive(socket)
- data = await self._fn(*args, data=received_data, **kwargs)
- if handle_send:
- await handle_send(socket, data)
-
-
-def create_handler_signature(callback_signature: Signature) -> Signature:
- """Creates a :class:`Signature` for the handler function for signature modelling.
-
- This is required for two reasons:
-
- 1. the :class:`.handlers.WebsocketHandler` signature model cannot contain the ``data`` parameter, which is
- required for :class:`.handlers.websocket_listener` handlers.
- 2. the :class;`.handlers.WebsocketHandler` signature model must include the ``socket`` parameter, which is
- optional for :class:`.handlers.websocket_listener` handlers.
-
- Args:
- callback_signature: The :class:`Signature` of the listener callback.
-
- Returns:
- The :class:`Signature` for the listener callback as required for signature modelling.
- """
- new_params = [p for p in callback_signature.parameters.values() if p.name != "data"]
- if "socket" not in callback_signature.parameters:
- new_params.append(Parameter(name="socket", kind=Parameter.KEYWORD_ONLY, annotation="WebSocket"))
-
- new_params.append(
- Parameter(name="connection_lifespan_dependencies", kind=Parameter.KEYWORD_ONLY, annotation="Dict[str, Any]")
- )
-
- return callback_signature.replace(parameters=new_params)
-
-
-def create_stub_dependency(src: AnyCallable) -> Provide:
- """Create a stub dependency, accepting any kwargs defined in ``src``, and
- wrap it in ``Provide``
- """
- src = unwrap_partial(src)
-
- @wraps(src)
- async def stub(**kwargs: Any) -> Dict[str, Any]: # noqa: UP006
- return kwargs
-
- return Provide(stub)
diff --git a/venv/lib/python3.11/site-packages/litestar/handlers/websocket_handlers/listener.py b/venv/lib/python3.11/site-packages/litestar/handlers/websocket_handlers/listener.py
deleted file mode 100644
index 86fefc9..0000000
--- a/venv/lib/python3.11/site-packages/litestar/handlers/websocket_handlers/listener.py
+++ /dev/null
@@ -1,417 +0,0 @@
-from __future__ import annotations
-
-from abc import ABC, abstractmethod
-from contextlib import AbstractAsyncContextManager, asynccontextmanager
-from typing import (
- TYPE_CHECKING,
- Any,
- AsyncGenerator,
- Callable,
- Dict,
- Mapping,
- Optional,
- cast,
- overload,
-)
-
-from litestar._signature import SignatureModel
-from litestar.connection import WebSocket
-from litestar.exceptions import ImproperlyConfiguredException, WebSocketDisconnect
-from litestar.types import (
- AnyCallable,
- Dependencies,
- Empty,
- EmptyType,
- ExceptionHandler,
- Guard,
- Middleware,
- TypeEncodersMap,
-)
-from litestar.utils import ensure_async_callable
-from litestar.utils.signature import ParsedSignature, get_fn_type_hints
-
-from ._utils import (
- ListenerHandler,
- create_handle_receive,
- create_handle_send,
- create_handler_signature,
- create_stub_dependency,
-)
-from .route_handler import WebsocketRouteHandler
-
-if TYPE_CHECKING:
- from typing import Coroutine
-
- from typing_extensions import Self
-
- from litestar import Router
- from litestar.dto import AbstractDTO
- from litestar.types.asgi_types import WebSocketMode
- from litestar.types.composite_types import TypeDecodersSequence
-
-__all__ = ("WebsocketListener", "WebsocketListenerRouteHandler", "websocket_listener")
-
-
-class WebsocketListenerRouteHandler(WebsocketRouteHandler):
- """A websocket listener that automatically accepts a connection, handles disconnects,
- invokes a callback function every time new data is received and sends any data
- returned
- """
-
- __slots__ = {
- "connection_accept_handler": "Callback to accept a WebSocket connection. By default, calls WebSocket.accept",
- "on_accept": "Callback invoked after a WebSocket connection has been accepted",
- "on_disconnect": "Callback invoked after a WebSocket connection has been closed",
- "weboscket_class": "WebSocket class",
- "_connection_lifespan": None,
- "_handle_receive": None,
- "_handle_send": None,
- "_receive_mode": None,
- "_send_mode": None,
- }
-
- @overload
- def __init__(
- self,
- path: str | list[str] | None = None,
- *,
- connection_lifespan: Callable[..., AbstractAsyncContextManager[Any]] | None = None,
- dependencies: Dependencies | None = None,
- dto: type[AbstractDTO] | None | EmptyType = Empty,
- exception_handlers: dict[int | type[Exception], ExceptionHandler] | None = None,
- guards: list[Guard] | None = None,
- middleware: list[Middleware] | None = None,
- receive_mode: WebSocketMode = "text",
- send_mode: WebSocketMode = "text",
- name: str | None = None,
- opt: dict[str, Any] | None = None,
- return_dto: type[AbstractDTO] | None | EmptyType = Empty,
- signature_namespace: Mapping[str, Any] | None = None,
- type_decoders: TypeDecodersSequence | None = None,
- type_encoders: TypeEncodersMap | None = None,
- websocket_class: type[WebSocket] | None = None,
- **kwargs: Any,
- ) -> None: ...
-
- @overload
- def __init__(
- self,
- path: str | list[str] | None = None,
- *,
- connection_accept_handler: Callable[[WebSocket], Coroutine[Any, Any, None]] = WebSocket.accept,
- dependencies: Dependencies | None = None,
- dto: type[AbstractDTO] | None | EmptyType = Empty,
- exception_handlers: dict[int | type[Exception], ExceptionHandler] | None = None,
- guards: list[Guard] | None = None,
- middleware: list[Middleware] | None = None,
- receive_mode: WebSocketMode = "text",
- send_mode: WebSocketMode = "text",
- name: str | None = None,
- on_accept: AnyCallable | None = None,
- on_disconnect: AnyCallable | None = None,
- opt: dict[str, Any] | None = None,
- return_dto: type[AbstractDTO] | None | EmptyType = Empty,
- signature_namespace: Mapping[str, Any] | None = None,
- type_decoders: TypeDecodersSequence | None = None,
- type_encoders: TypeEncodersMap | None = None,
- websocket_class: type[WebSocket] | None = None,
- **kwargs: Any,
- ) -> None: ...
-
- def __init__(
- self,
- path: str | list[str] | None = None,
- *,
- connection_accept_handler: Callable[[WebSocket], Coroutine[Any, Any, None]] = WebSocket.accept,
- connection_lifespan: Callable[..., AbstractAsyncContextManager[Any]] | None = None,
- dependencies: Dependencies | None = None,
- dto: type[AbstractDTO] | None | EmptyType = Empty,
- exception_handlers: dict[int | type[Exception], ExceptionHandler] | None = None,
- guards: list[Guard] | None = None,
- middleware: list[Middleware] | None = None,
- receive_mode: WebSocketMode = "text",
- send_mode: WebSocketMode = "text",
- name: str | None = None,
- on_accept: AnyCallable | None = None,
- on_disconnect: AnyCallable | None = None,
- opt: dict[str, Any] | None = None,
- return_dto: type[AbstractDTO] | None | EmptyType = Empty,
- signature_namespace: Mapping[str, Any] | None = None,
- type_decoders: TypeDecodersSequence | None = None,
- type_encoders: TypeEncodersMap | None = None,
- websocket_class: type[WebSocket] | None = None,
- **kwargs: Any,
- ) -> None:
- """Initialize ``WebsocketRouteHandler``
-
- Args:
- path: A path fragment for the route handler function or a sequence of path fragments. If not given defaults
- to ``/``
- connection_accept_handler: A callable that accepts a :class:`WebSocket <.connection.WebSocket>` instance
- and returns a coroutine that when awaited, will accept the connection. Defaults to ``WebSocket.accept``.
- connection_lifespan: An asynchronous context manager, handling the lifespan of the connection. By default,
- it calls the ``connection_accept_handler``, ``on_connect`` and ``on_disconnect``. Can request any
- dependencies, for example the :class:`WebSocket <.connection.WebSocket>` connection
- dependencies: A string keyed mapping of dependency :class:`Provider <.di.Provide>` instances.
- dto: :class:`AbstractDTO <.dto.base_dto.AbstractDTO>` to use for (de)serializing and
- validation of request data.
- exception_handlers: A mapping of status codes and/or exception types to handler functions.
- guards: A sequence of :class:`Guard <.types.Guard>` callables.
- middleware: A sequence of :class:`Middleware <.types.Middleware>`.
- receive_mode: Websocket mode to receive data in, either `text` or `binary`.
- send_mode: Websocket mode to receive data in, either `text` or `binary`.
- name: A string identifying the route handler.
- on_accept: Callback invoked after a connection has been accepted. Can request any dependencies, for example
- the :class:`WebSocket <.connection.WebSocket>` connection
- on_disconnect: Callback invoked after a connection has been closed. Can request any dependencies, for
- example the :class:`WebSocket <.connection.WebSocket>` connection
- opt: A string keyed mapping of arbitrary values that can be accessed in :class:`Guards <.types.Guard>` or
- wherever you have access to :class:`Request <.connection.Request>` or
- :class:`ASGI Scope <.types.Scope>`.
- return_dto: :class:`AbstractDTO <.dto.base_dto.AbstractDTO>` to use for serializing
- outbound response data.
- signature_namespace: A mapping of names to types for use in forward reference resolution during signature
- modelling.
- type_decoders: A sequence of tuples, each composed of a predicate testing for type identity and a msgspec
- hook for deserialization.
- type_encoders: A mapping of types to callables that transform them into types supported for serialization.
- **kwargs: Any additional kwarg - will be set in the opt dictionary.
- websocket_class: A custom subclass of :class:`WebSocket <.connection.WebSocket>` to be used as route handler's
- default websocket class.
- """
- if connection_lifespan and any([on_accept, on_disconnect, connection_accept_handler is not WebSocket.accept]):
- raise ImproperlyConfiguredException(
- "connection_lifespan can not be used with connection hooks "
- "(on_accept, on_disconnect, connection_accept_handler)",
- )
-
- self._receive_mode: WebSocketMode = receive_mode
- self._send_mode: WebSocketMode = send_mode
- self._connection_lifespan = connection_lifespan
- self._send_handler: Callable[[WebSocket, Any], Coroutine[None, None, None]] | EmptyType = Empty
- self._receive_handler: Callable[[WebSocket], Any] | EmptyType = Empty
-
- self.connection_accept_handler = connection_accept_handler
- self.on_accept = ensure_async_callable(on_accept) if on_accept else None
- self.on_disconnect = ensure_async_callable(on_disconnect) if on_disconnect else None
- self.type_decoders = type_decoders
- self.type_encoders = type_encoders
- self.websocket_class = websocket_class
-
- listener_dependencies = dict(dependencies or {})
-
- listener_dependencies["connection_lifespan_dependencies"] = create_stub_dependency(
- connection_lifespan or self.default_connection_lifespan
- )
-
- if self.on_accept:
- listener_dependencies["on_accept_dependencies"] = create_stub_dependency(self.on_accept)
-
- if self.on_disconnect:
- listener_dependencies["on_disconnect_dependencies"] = create_stub_dependency(self.on_disconnect)
-
- super().__init__(
- path=path,
- dependencies=listener_dependencies,
- exception_handlers=exception_handlers,
- guards=guards,
- middleware=middleware,
- name=name,
- opt=opt,
- signature_namespace=signature_namespace,
- dto=dto,
- return_dto=return_dto,
- type_decoders=type_decoders,
- type_encoders=type_encoders,
- websocket_class=websocket_class,
- **kwargs,
- )
-
- def __call__(self, fn: AnyCallable) -> Self:
- parsed_signature = ParsedSignature.from_fn(fn, self.resolve_signature_namespace())
-
- if "data" not in parsed_signature.parameters:
- raise ImproperlyConfiguredException("Websocket listeners must accept a 'data' parameter")
-
- for param in ("request", "body"):
- if param in parsed_signature.parameters:
- raise ImproperlyConfiguredException(f"The {param} kwarg is not supported with websocket listeners")
-
- # we are manipulating the signature of the decorated function below, so we must store the original values for
- # use elsewhere.
- self._parsed_return_field = parsed_signature.return_type
- self._parsed_data_field = parsed_signature.parameters.get("data")
- self._parsed_fn_signature = ParsedSignature.from_signature(
- create_handler_signature(parsed_signature.original_signature),
- fn_type_hints={
- **get_fn_type_hints(fn, namespace=self.resolve_signature_namespace()),
- **get_fn_type_hints(ListenerHandler.__call__, namespace=self.resolve_signature_namespace()),
- },
- )
-
- return super().__call__(
- ListenerHandler(
- listener=self, fn=fn, parsed_signature=parsed_signature, namespace=self.resolve_signature_namespace()
- )
- )
-
- def _validate_handler_function(self) -> None:
- """Validate the route handler function once it's set by inspecting its return annotations."""
- # validation occurs in the call method
-
- @property
- def signature_model(self) -> type[SignatureModel]:
- """Get the signature model for the route handler.
-
- Returns:
- A signature model for the route handler.
-
- """
- if self._signature_model is Empty:
- self._signature_model = SignatureModel.create(
- dependency_name_set=self.dependency_name_set,
- fn=cast("AnyCallable", self.fn),
- parsed_signature=self.parsed_fn_signature,
- type_decoders=self.resolve_type_decoders(),
- )
- return self._signature_model
-
- @asynccontextmanager
- async def default_connection_lifespan(
- self,
- socket: WebSocket,
- on_accept_dependencies: Optional[Dict[str, Any]] = None, # noqa: UP006, UP007
- on_disconnect_dependencies: Optional[Dict[str, Any]] = None, # noqa: UP006, UP007
- ) -> AsyncGenerator[None, None]:
- """Handle the connection lifespan of a :class:`WebSocket <.connection.WebSocket>`.
-
- Args:
- socket: The :class:`WebSocket <.connection.WebSocket>` connection
- on_accept_dependencies: Dependencies requested by the :attr:`on_accept` hook
- on_disconnect_dependencies: Dependencies requested by the :attr:`on_disconnect` hook
-
- By, default this will
-
- - Call :attr:`connection_accept_handler` to accept a connection
- - Call :attr:`on_accept` if defined after a connection has been accepted
- - Call :attr:`on_disconnect` upon leaving the context
- """
- await self.connection_accept_handler(socket)
-
- if self.on_accept:
- await self.on_accept(**(on_accept_dependencies or {}))
-
- try:
- yield
- except WebSocketDisconnect:
- pass
- finally:
- if self.on_disconnect:
- await self.on_disconnect(**(on_disconnect_dependencies or {}))
-
- def resolve_receive_handler(self) -> Callable[[WebSocket], Any]:
- if self._receive_handler is Empty:
- self._receive_handler = create_handle_receive(self)
- return self._receive_handler
-
- def resolve_send_handler(self) -> Callable[[WebSocket, Any], Coroutine[None, None, None]]:
- if self._send_handler is Empty:
- self._send_handler = create_handle_send(self)
- return self._send_handler
-
-
-websocket_listener = WebsocketListenerRouteHandler
-
-
-class WebsocketListener(ABC):
- path: str | list[str] | None = None
- """A path fragment for the route handler function or a sequence of path fragments. If not given defaults to ``/``"""
- dependencies: Dependencies | None = None
- """A string keyed mapping of dependency :class:`Provider <.di.Provide>` instances."""
- dto: type[AbstractDTO] | None | EmptyType = Empty
- """:class:`AbstractDTO <.dto.base_dto.AbstractDTO>` to use for (de)serializing and validation of request data"""
- exception_handlers: dict[int | type[Exception], ExceptionHandler] | None = None
- """A mapping of status codes and/or exception types to handler functions."""
- guards: list[Guard] | None = None
- """A sequence of :class:`Guard <.types.Guard>` callables."""
- middleware: list[Middleware] | None = None
- """A sequence of :class:`Middleware <.types.Middleware>`."""
- on_accept: AnyCallable | None = None
- """Called after a :class:`WebSocket <.connection.WebSocket>` connection has been accepted. Can receive any dependencies"""
- on_disconnect: AnyCallable | None = None
- """Called after a :class:`WebSocket <.connection.WebSocket>` connection has been disconnected. Can receive any dependencies"""
- receive_mode: WebSocketMode = "text"
- """:class:`WebSocket <.connection.WebSocket>` mode to receive data in, either ``text`` or ``binary``."""
- send_mode: WebSocketMode = "text"
- """Websocket mode to send data in, either `text` or `binary`."""
- name: str | None = None
- """A string identifying the route handler."""
- opt: dict[str, Any] | None = None
- """
- A string keyed mapping of arbitrary values that can be accessed in :class:`Guards <.types.Guard>` or wherever you
- have access to :class:`Request <.connection.Request>` or :class:`ASGI Scope <.types.Scope>`.
- """
- return_dto: type[AbstractDTO] | None | EmptyType = Empty
- """:class:`AbstractDTO <.dto.base_dto.AbstractDTO>` to use for serializing outbound response data."""
- signature_namespace: Mapping[str, Any] | None = None
- """
- A mapping of names to types for use in forward reference resolution during signature modelling.
- """
- type_decoders: TypeDecodersSequence | None = None
- """
- type_decoders: A sequence of tuples, each composed of a predicate testing for type identity and a msgspec
- hook for deserialization.
- """
- type_encoders: TypeEncodersMap | None = None
- """
- type_encoders: A mapping of types to callables that transform them into types supported for serialization.
- """
- websocket_class: type[WebSocket] | None = None
- """
- websocket_class: A custom subclass of :class:`WebSocket <.connection.WebSocket>` to be used as route handler's
- default websocket class.
- """
-
- def __init__(self, owner: Router) -> None:
- """Initialize a WebsocketListener instance.
-
- Args:
- owner: The :class:`Router <.router.Router>` instance that owns this listener.
- """
- self._owner = owner
-
- def to_handler(self) -> WebsocketListenerRouteHandler:
- handler = WebsocketListenerRouteHandler(
- dependencies=self.dependencies,
- dto=self.dto,
- exception_handlers=self.exception_handlers,
- guards=self.guards,
- middleware=self.middleware,
- send_mode=self.send_mode,
- receive_mode=self.receive_mode,
- name=self.name,
- on_accept=self.on_accept,
- on_disconnect=self.on_disconnect,
- opt=self.opt,
- path=self.path,
- return_dto=self.return_dto,
- signature_namespace=self.signature_namespace,
- type_decoders=self.type_decoders,
- type_encoders=self.type_encoders,
- websocket_class=self.websocket_class,
- )(self.on_receive)
- handler.owner = self._owner
- return handler
-
- @abstractmethod
- def on_receive(self, *args: Any, **kwargs: Any) -> Any:
- """Called after data has been received from the WebSocket.
-
- This should take a ``data`` argument, receiving the processed WebSocket data,
- and can additionally include handler dependencies such as ``state``, or other
- regular dependencies.
-
- Data returned from this function will be serialized and sent via the socket
- according to handler configuration.
- """
- raise NotImplementedError
diff --git a/venv/lib/python3.11/site-packages/litestar/handlers/websocket_handlers/route_handler.py b/venv/lib/python3.11/site-packages/litestar/handlers/websocket_handlers/route_handler.py
deleted file mode 100644
index edb49c3..0000000
--- a/venv/lib/python3.11/site-packages/litestar/handlers/websocket_handlers/route_handler.py
+++ /dev/null
@@ -1,99 +0,0 @@
-from __future__ import annotations
-
-from typing import TYPE_CHECKING, Any, Mapping
-
-from litestar.connection import WebSocket
-from litestar.exceptions import ImproperlyConfiguredException
-from litestar.handlers import BaseRouteHandler
-from litestar.types.builtin_types import NoneType
-from litestar.utils.predicates import is_async_callable
-
-if TYPE_CHECKING:
- from litestar.types import Dependencies, ExceptionHandler, Guard, Middleware
-
-
-class WebsocketRouteHandler(BaseRouteHandler):
- """Websocket route handler decorator.
-
- Use this decorator to decorate websocket handler functions.
- """
-
- def __init__(
- self,
- path: str | list[str] | None = None,
- *,
- dependencies: Dependencies | None = None,
- exception_handlers: dict[int | type[Exception], ExceptionHandler] | None = None,
- guards: list[Guard] | None = None,
- middleware: list[Middleware] | None = None,
- name: str | None = None,
- opt: dict[str, Any] | None = None,
- signature_namespace: Mapping[str, Any] | None = None,
- websocket_class: type[WebSocket] | None = None,
- **kwargs: Any,
- ) -> None:
- """Initialize ``WebsocketRouteHandler``
-
- Args:
- path: A path fragment for the route handler function or a sequence of path fragments. If not given defaults
- to ``/``
- dependencies: A string keyed mapping of dependency :class:`Provider <.di.Provide>` instances.
- exception_handlers: A mapping of status codes and/or exception types to handler functions.
- guards: A sequence of :class:`Guard <.types.Guard>` callables.
- middleware: A sequence of :class:`Middleware <.types.Middleware>`.
- name: A string identifying the route handler.
- opt: A string keyed mapping of arbitrary values that can be accessed in :class:`Guards <.types.Guard>` or
- wherever you have access to :class:`Request <.connection.Request>` or
- :class:`ASGI Scope <.types.Scope>`.
- signature_namespace: A mapping of names to types for use in forward reference resolution during signature modelling.
- type_encoders: A mapping of types to callables that transform them into types supported for serialization.
- **kwargs: Any additional kwarg - will be set in the opt dictionary.
- websocket_class: A custom subclass of :class:`WebSocket <.connection.WebSocket>` to be used as route handler's
- default websocket class.
- """
- self.websocket_class = websocket_class
-
- super().__init__(
- path=path,
- dependencies=dependencies,
- exception_handlers=exception_handlers,
- guards=guards,
- middleware=middleware,
- name=name,
- opt=opt,
- signature_namespace=signature_namespace,
- **kwargs,
- )
-
- def resolve_websocket_class(self) -> type[WebSocket]:
- """Return the closest custom WebSocket class in the owner graph or the default Websocket class.
-
- This method is memoized so the computation occurs only once.
-
- Returns:
- The default :class:`WebSocket <.connection.WebSocket>` class for the route handler.
- """
- return next(
- (layer.websocket_class for layer in reversed(self.ownership_layers) if layer.websocket_class is not None),
- WebSocket,
- )
-
- def _validate_handler_function(self) -> None:
- """Validate the route handler function once it's set by inspecting its return annotations."""
- super()._validate_handler_function()
-
- if not self.parsed_fn_signature.return_type.is_subclass_of(NoneType):
- raise ImproperlyConfiguredException("Websocket handler functions should return 'None'")
-
- if "socket" not in self.parsed_fn_signature.parameters:
- raise ImproperlyConfiguredException("Websocket handlers must set a 'socket' kwarg")
-
- for param in ("request", "body", "data"):
- if param in self.parsed_fn_signature.parameters:
- raise ImproperlyConfiguredException(f"The {param} kwarg is not supported with websocket handlers")
-
- if not is_async_callable(self.fn):
- raise ImproperlyConfiguredException("Functions decorated with 'websocket' must be async functions")
-
-
-websocket = WebsocketRouteHandler