From 9020f8880b4f16d890c472ec5da63b608fcce459 Mon Sep 17 00:00:00 2001 From: sergey Date: Tue, 8 Oct 2024 19:10:34 +0300 Subject: [PATCH] add redis --- config/.env-template | 10 +++++++++- config/config.py | 17 +++++++++++++---- main.py | 10 ++++++++++ poetry.lock | 17 ++++++++++++++++- pyproject.toml | 1 + reddis/__init__.py | 6 ++++++ reddis/crud.py | 16 ++++++++++++++++ reddis/r_helper.py | 25 +++++++++++++++++++++++++ requirements.txt | 1 + routers/__init__.py | 1 - 10 files changed, 97 insertions(+), 7 deletions(-) create mode 100644 reddis/crud.py create mode 100644 reddis/r_helper.py diff --git a/config/.env-template b/config/.env-template index 0e4d414..a9b286d 100644 --- a/config/.env-template +++ b/config/.env-template @@ -2,7 +2,15 @@ OAA_CFG__RUN__HOST=0.0.0.0 OAA_CFG__RUN__PORT=8000 OAA_CFG__RUN__RELOAD=True OAA_CFG__LOG__LEVEL=20 + OAA_CFG__TOKEN__ADMIN=pE0ULNppBtQOOxRuVw1tdiXTG5dZTaSx OAA_CFG__TOKEN__USER=A3mojtenQqYwJAgrSiiFaVHX6fRoVW15 + OAA_CFG__ADMIN_USER__LOGIN=admin -OAA_CFG__ADMIN_USER__PWD=P@ssw0rd! \ No newline at end of file +OAA_CFG__ADMIN_USER__PWD=P@ssw0rd! + +OAA_CFG__REDDIS__HOST=localhost +OAA_CFG__REDDIS__PORT=6379 +OAA_CFG__REDDIS__DB=0 +OAA_CFG__REDDIS__LOGIN=admin +OAA_CFG__REDDIS__PWD=P@ssw0rd! \ No newline at end of file diff --git a/config/config.py b/config/config.py index ae7a203..53f8c5c 100644 --- a/config/config.py +++ b/config/config.py @@ -28,13 +28,13 @@ class LogConfig(BaseModel): ) -class Prefix(BaseModel): +class PrefixConfig(BaseModel): swagger: str = "/docs" api_v1: str = "/api/v1" tg_v1: str = api_v1 + "/tg" -class Token(BaseModel): +class TokenConfig(BaseModel): admin: str user: str @@ -44,6 +44,14 @@ class AdminUser(BaseModel): pwd: str +class ReddisConfig(BaseModel): + host: str = "localhost" + port: int = 6379 + db: int = 0 + login: str + pwd: str + + class SwaggerConfig(BaseModel): openapi_url: str = "/openapi.json" title: str = "API" @@ -66,9 +74,10 @@ class Settings(BaseSettings): run: RunConfig = RunConfig() swagger: SwaggerConfig = SwaggerConfig() log: LogConfig = LogConfig() - prefix: Prefix = Prefix() - token: Token + prefix: PrefixConfig = PrefixConfig() + token: TokenConfig admin_user: AdminUser + reddis: ReddisConfig conf = Settings() diff --git a/main.py b/main.py index 410885a..7d6908e 100644 --- a/main.py +++ b/main.py @@ -5,12 +5,22 @@ from fastapi import FastAPI from fastapi.responses import ORJSONResponse from starlette.staticfiles import StaticFiles from routers import router +from contextlib import asynccontextmanager + + +@asynccontextmanager +async def lifespan(app: FastAPI): + yield + await db_helper.dispose() + main_app = FastAPI( default_response_class=ORJSONResponse, docs_url=None, + lifespan=lifespan, ) + main_app.include_router(router) main_app.mount("/static", StaticFiles(directory=STATIC_DIR), name="static") diff --git a/poetry.lock b/poetry.lock index 03f6446..8b5887a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -528,6 +528,21 @@ files = [ {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] +[[package]] +name = "redis" +version = "5.1.1" +description = "Python client for Redis database and key-value store" +optional = false +python-versions = ">=3.8" +files = [ + {file = "redis-5.1.1-py3-none-any.whl", hash = "sha256:f8ea06b7482a668c6475ae202ed8d9bcaa409f6e87fb77ed1043d912afd62e24"}, + {file = "redis-5.1.1.tar.gz", hash = "sha256:f6c997521fedbae53387307c5d0bf784d9acc28d9f1d058abeac566ec4dbed72"}, +] + +[package.extras] +hiredis = ["hiredis (>=3.0.0)"] +ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==23.2.1)", "requests (>=2.31.0)"] + [[package]] name = "sniffio" version = "1.3.1" @@ -829,4 +844,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.12" -content-hash = "03bfacdc4e1c32b9de32fc239cf6219e6c07d189a07fe6d29f8d050fc7166f53" +content-hash = "94c62ee12b20f7b2cdc03c8d1e8e8e31478a5dc9eb541ada0119fbb8a4b62222" diff --git a/pyproject.toml b/pyproject.toml index 1f74ff8..5ca866a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,6 +12,7 @@ pydantic-settings = "^2.5.2" fastapi = "^0.115.0" uvicorn = {extras = ["standard"], version = "^0.31.0"} orjson = "^3.10.7" +redis = "^5.1.1" [tool.poetry.group.dev.dependencies] diff --git a/reddis/__init__.py b/reddis/__init__.py index e69de29..8550491 100644 --- a/reddis/__init__.py +++ b/reddis/__init__.py @@ -0,0 +1,6 @@ +from .crud import get_value, set_value + +__all__ = [ + "get_value", + "set_value", +] diff --git a/reddis/crud.py b/reddis/crud.py new file mode 100644 index 0000000..ee7b0c3 --- /dev/null +++ b/reddis/crud.py @@ -0,0 +1,16 @@ +import logging as log + +from r_helper import RedisClient + + +async def set_value(key, value): + async with RedisClient() as redis_client: + await redis_client.set_value(key, value) + log.info("Set %s = %s", key, value) + + +async def get_value(key): + async with RedisClient() as redis_client: + value = await redis_client.get_value(key) + log.info("Get %s = %s", key, value) + return value diff --git a/reddis/r_helper.py b/reddis/r_helper.py new file mode 100644 index 0000000..b08cf19 --- /dev/null +++ b/reddis/r_helper.py @@ -0,0 +1,25 @@ +from redis.asyncio import Redis +from config import conf + + +class RedisClient: + async def __aenter__(self): + self.client = Redis( + host=conf.reddis.host, + port=conf.reddis.port, + db=conf.reddis.db, + username=conf.reddis.login, + password=conf.reddis.pwd, + ) + return self.client + + async def __aexit__(self, exc_type, exc_val, exc_tb): + await self.client.close() + + async def set_value(self, key, value): + async with self as client: + await client.set(key, value) + + async def get_value(self, key): + async with self as client: + return await client.get(key) diff --git a/requirements.txt b/requirements.txt index 17cea95..682ed10 100644 --- a/requirements.txt +++ b/requirements.txt @@ -43,6 +43,7 @@ pyproject_hooks==1.2.0 python-dotenv==1.0.1 PyYAML==6.0.2 RapidFuzz==3.10.0 +redis==5.1.1 requests==2.32.3 requests-toolbelt==1.0.0 SecretStorage==3.3.3 diff --git a/routers/__init__.py b/routers/__init__.py index 9a9eba4..50f0317 100644 --- a/routers/__init__.py +++ b/routers/__init__.py @@ -11,7 +11,6 @@ router = APIRouter() router.include_router( swagger_router, prefix=conf.prefix.swagger, - tags=["Swagger"], ) router.include_router( tg_send_router,