From 4dd1e4b1a6c1b7cca34803e66271622cc6eb450b Mon Sep 17 00:00:00 2001 From: Miwory Date: Thu, 6 Nov 2025 13:54:22 +0300 Subject: [PATCH] =?UTF-8?q?Redis=20=D0=BA=D0=BB=D0=B8=D0=B5=D0=BD=D1=82=20?= =?UTF-8?q?=D1=81=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=20=D1=81=20=D1=81=D0=B8?= =?UTF-8?q?=D0=BD=D1=85=D1=80=D0=BE=D0=BD=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=B0=D1=81=D1=81=D0=B8=D0=BD=D1=85=D1=80=D0=BE=D0=BD?= =?UTF-8?q?=D0=BD=D1=8B=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 2 +- src/aiohttpx/transports/cache.py | 15 ++++++++------- src/aiohttpx/transports/rate_limiter.py | 8 ++++---- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 8cb774c..992b446 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "aiohttpx" -version = "1.1.0" +version = "1.2.0" description = "Custom HTTPX client with aiohttp transport, rate limiter and caching" readme = "README.md" authors = [ diff --git a/src/aiohttpx/transports/cache.py b/src/aiohttpx/transports/cache.py index e4d0172..d80e814 100644 --- a/src/aiohttpx/transports/cache.py +++ b/src/aiohttpx/transports/cache.py @@ -2,9 +2,10 @@ from httpx import Request from httpx import Response as HTTPXResponse from httpx import _models as m # type: ignore from orjson import dumps, loads +from redis.asyncio import Redis from aiohttpx.responses import Response -from aiohttpx.transports.rate_limiter import AsyncRateLimit, Redis +from aiohttpx.transports.rate_limiter import AsyncRateLimit def generate_cache_key(request: Request) -> str: @@ -15,7 +16,7 @@ def generate_cache_key(request: Request) -> str: return f'cache:{hash(str(dumps(request_data)))}' -def cache_response( +async def cache_response( client: Redis[bytes], cache_key: str, request: Request, @@ -25,7 +26,7 @@ def cache_response( ttl = get_ttl_from_headers(request.headers) if ttl: - client.set(cache_key, serialized_response, ex=ttl) + await client.set(cache_key, serialized_response, ex=ttl) def get_ttl_from_headers(headers: m.Headers) -> int | None: @@ -36,10 +37,10 @@ def get_ttl_from_headers(headers: m.Headers) -> int | None: return None -def get_cached_response( +async def get_cached_response( client: Redis[bytes], cache_key: str ) -> Response | None: - cached_data = client.get(cache_key) + cached_data = await client.get(cache_key) if cached_data: return deserialize_response(cached_data) @@ -83,13 +84,13 @@ class AsyncCacheTransport(AsyncRateLimit): return await self.transport.handle_async_request(request) cache_key = generate_cache_key(request) - cached_response = get_cached_response(self.client, cache_key) + cached_response = await get_cached_response(self.client, cache_key) if cached_response: return cached_response response = await self.transport.handle_async_request(request) - cache_response(self.client, cache_key, request, response) + await cache_response(self.client, cache_key, request, response) return response diff --git a/src/aiohttpx/transports/rate_limiter.py b/src/aiohttpx/transports/rate_limiter.py index 20c2ebd..aef15da 100644 --- a/src/aiohttpx/transports/rate_limiter.py +++ b/src/aiohttpx/transports/rate_limiter.py @@ -1,7 +1,7 @@ from asyncio import sleep as async_sleep from httpx import Request -from redis import Redis +from redis.asyncio import Redis from aiohttpx.responses import Response from aiohttpx.transports.aio import AiohttpTransport @@ -30,14 +30,14 @@ class AsyncRateLimit(AiohttpTransport): t: int = int(self.client.time()[0]) # type: ignore separation = round(60 / self.limit) - value = self.client.get(self.key) or t - self.client.setnx(self.key, value) + value = await self.client.get(self.key) or t + await self.client.setnx(self.key, value) tat = max(int(value), t) if tat - t <= 60 - separation: new_tat = max(tat, t) + separation - self.client.set(self.key, new_tat) + await self.client.set(self.key, new_tat) return False return True