|
12 | 12 | from fastapi.openapi.utils import get_openapi |
13 | 13 |
|
14 | 14 | from ..api.dependencies import get_current_superuser |
| 15 | +from ..core.utils.rate_limit import rate_limiter |
15 | 16 | from ..middleware.client_cache_middleware import ClientCacheMiddleware |
| 17 | +from ..models import * |
16 | 18 | from .config import ( |
17 | 19 | AppSettings, |
18 | 20 | ClientSideCacheSettings, |
|
24 | 26 | RedisRateLimiterSettings, |
25 | 27 | settings, |
26 | 28 | ) |
27 | | -from .db.database import Base, async_engine as engine |
| 29 | +from .db.database import Base |
| 30 | +from .db.database import async_engine as engine |
28 | 31 | from .utils import cache, queue, rate_limit |
29 | | -from ..models import * |
| 32 | + |
30 | 33 |
|
31 | 34 | # -------------- database -------------- |
32 | 35 | async def create_tables() -> None: |
@@ -55,8 +58,7 @@ async def close_redis_queue_pool() -> None: |
55 | 58 |
|
56 | 59 | # -------------- rate limit -------------- |
57 | 60 | async def create_redis_rate_limit_pool() -> None: |
58 | | - rate_limit.pool = redis.ConnectionPool.from_url(settings.REDIS_RATE_LIMIT_URL) |
59 | | - rate_limit.client = redis.Redis.from_pool(rate_limit.pool) # type: ignore |
| 61 | + rate_limiter.initialize(settings.REDIS_RATE_LIMIT_URL) # type: ignore |
60 | 62 |
|
61 | 63 |
|
62 | 64 | async def close_redis_rate_limit_pool() -> None: |
@@ -85,30 +87,36 @@ def lifespan_factory( |
85 | 87 |
|
86 | 88 | @asynccontextmanager |
87 | 89 | async def lifespan(app: FastAPI) -> AsyncGenerator: |
| 90 | + from asyncio import Event |
| 91 | + |
| 92 | + initialization_complete = Event() |
| 93 | + app.state.initialization_complete = initialization_complete |
| 94 | + |
88 | 95 | await set_threadpool_tokens() |
89 | 96 |
|
90 | | - if isinstance(settings, DatabaseSettings) and create_tables_on_start: |
91 | | - await create_tables() |
| 97 | + try: |
| 98 | + if isinstance(settings, RedisCacheSettings): |
| 99 | + await create_redis_cache_pool() |
92 | 100 |
|
93 | | - if isinstance(settings, RedisCacheSettings): |
94 | | - await create_redis_cache_pool() |
| 101 | + if isinstance(settings, RedisQueueSettings): |
| 102 | + await create_redis_queue_pool() |
95 | 103 |
|
96 | | - if isinstance(settings, RedisQueueSettings): |
97 | | - await create_redis_queue_pool() |
| 104 | + if isinstance(settings, RedisRateLimiterSettings): |
| 105 | + await create_redis_rate_limit_pool() |
98 | 106 |
|
99 | | - if isinstance(settings, RedisRateLimiterSettings): |
100 | | - await create_redis_rate_limit_pool() |
| 107 | + initialization_complete.set() |
101 | 108 |
|
102 | | - yield |
| 109 | + yield |
103 | 110 |
|
104 | | - if isinstance(settings, RedisCacheSettings): |
105 | | - await close_redis_cache_pool() |
| 111 | + finally: |
| 112 | + if isinstance(settings, RedisCacheSettings): |
| 113 | + await close_redis_cache_pool() |
106 | 114 |
|
107 | | - if isinstance(settings, RedisQueueSettings): |
108 | | - await close_redis_queue_pool() |
| 115 | + if isinstance(settings, RedisQueueSettings): |
| 116 | + await close_redis_queue_pool() |
109 | 117 |
|
110 | | - if isinstance(settings, RedisRateLimiterSettings): |
111 | | - await close_redis_rate_limit_pool() |
| 118 | + if isinstance(settings, RedisRateLimiterSettings): |
| 119 | + await close_redis_rate_limit_pool() |
112 | 120 |
|
113 | 121 | return lifespan |
114 | 122 |
|
|
0 commit comments