Skip to content

Commit 517e151

Browse files
committed
Default to in-memory in cases redis fails to connect.
1 parent d191db7 commit 517e151

File tree

1 file changed

+22
-1
lines changed

1 file changed

+22
-1
lines changed

starlette_plus/core.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,12 @@
3434
if TYPE_CHECKING:
3535
from starlette.types import ASGIApp, Message, Receive, Scope, Send
3636

37+
from .redis import Redis
3738
from .types_.core import Methods, RouteOptions
3839
from .types_.limiter import BucketType, ExemptCallable, RateLimitData
3940

4041

42+
logger: logging.Logger = logging.getLogger(__name__)
4143
access_logger: logging.Logger = logging.getLogger("Route")
4244

4345

@@ -183,12 +185,31 @@ def __init__(self, *args: Any, **kwargs: Unpack[ApplicationOptions]) -> None:
183185
middleware_: list[Middleware] = kwargs.pop("middleware", [])
184186
middleware_.insert(0, Middleware(LoggingMiddleware)) if self._access_log else None
185187

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
187192

188193
self.add_view(self)
189194
for view in views:
190195
self.add_view(view)
191196

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+
192213
def __new__(cls, *args: Any, **kwargs: Any) -> Self:
193214
self: Self = super().__new__(cls)
194215
self.__routes__ = []

0 commit comments

Comments
 (0)