|
34 | 34 | if TYPE_CHECKING: |
35 | 35 | from starlette.types import ASGIApp, Message, Receive, Scope, Send |
36 | 36 |
|
| 37 | + from .redis import Redis |
37 | 38 | from .types_.core import Methods, RouteOptions |
38 | 39 | from .types_.limiter import BucketType, ExemptCallable, RateLimitData |
39 | 40 |
|
40 | 41 |
|
| 42 | +logger: logging.Logger = logging.getLogger(__name__) |
41 | 43 | access_logger: logging.Logger = logging.getLogger("Route") |
42 | 44 |
|
43 | 45 |
|
@@ -183,12 +185,31 @@ def __init__(self, *args: Any, **kwargs: Unpack[ApplicationOptions]) -> None: |
183 | 185 | middleware_: list[Middleware] = kwargs.pop("middleware", []) |
184 | 186 | middleware_.insert(0, Middleware(LoggingMiddleware)) if self._access_log else None |
185 | 187 |
|
186 | | - super().__init__(*args, **kwargs, middleware=middleware_) # type: ignore |
| 188 | + statrtups = kwargs.pop("on_startup", []) |
| 189 | + statrtups.append(self.__startup) |
| 190 | + |
| 191 | + super().__init__(*args, **kwargs, middleware=middleware_, on_startup=statrtups) # type: ignore |
187 | 192 |
|
188 | 193 | self.add_view(self) |
189 | 194 | for view in views: |
190 | 195 | self.add_view(view) |
191 | 196 |
|
| 197 | + async def __startup(self) -> None: |
| 198 | + for middleware in self.user_middleware: |
| 199 | + redis: Redis | None = middleware.kwargs.get("redis", None) # type: ignore |
| 200 | + |
| 201 | + if not redis: |
| 202 | + continue |
| 203 | + |
| 204 | + try: |
| 205 | + resp: bool = await redis.ping() |
| 206 | + except Exception: |
| 207 | + resp = False |
| 208 | + |
| 209 | + if not resp: |
| 210 | + logger.warning("Unable to connect to redis on %s, defaulting to in-memory.", middleware.cls.__name__) |
| 211 | + middleware.kwargs["redis"] = None |
| 212 | + |
192 | 213 | def __new__(cls, *args: Any, **kwargs: Any) -> Self: |
193 | 214 | self: Self = super().__new__(cls) |
194 | 215 | self.__routes__ = [] |
|
0 commit comments