1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
|
from typing import TYPE_CHECKING, List, Type
from litestar import Controller, Litestar, Router, get
from litestar.datastructures import State
from litestar.middleware import MiddlewareProtocol
if TYPE_CHECKING:
from litestar.types import ASGIApp, Receive, Scope, Send
def create_test_middleware(middleware_id: int) -> Type[MiddlewareProtocol]:
class TestMiddleware(MiddlewareProtocol):
def __init__(self, app: "ASGIApp") -> None:
self.app = app
async def __call__(self, scope: "Scope", receive: "Receive", send: "Send") -> None:
litestar_app = scope["app"]
litestar_app.state.setdefault("middleware_calls", [])
litestar_app.state["middleware_calls"].append(middleware_id)
await self.app(scope, receive, send)
return TestMiddleware
class MyController(Controller):
path = "/controller"
middleware = [create_test_middleware(4), create_test_middleware(5)]
@get(
"/handler",
middleware=[create_test_middleware(6), create_test_middleware(7)],
)
async def my_handler(self, state: State) -> List[int]:
return state["middleware_calls"]
router = Router(
path="/router",
route_handlers=[MyController],
middleware=[create_test_middleware(2), create_test_middleware(3)],
)
app = Litestar(
route_handlers=[router],
middleware=[create_test_middleware(0), create_test_middleware(1)],
)
# run: /router/controller/handler
|