This commit is contained in:
2024-04-15 04:02:47 +03:00
parent 3335ee5e22
commit 2b626b189f
12 changed files with 154 additions and 14 deletions

8
flask_demo_api/config.py Normal file
View File

@@ -0,0 +1,8 @@
from dataclasses import dataclass
from repository.config import RedisSettings
@dataclass(frozen=True)
class Settings:
redis: RedisSettings

47
flask_demo_api/ioc.py Normal file
View File

@@ -0,0 +1,47 @@
import redis # type: ignore
from config import Settings
from dishka import Container, Provider, Scope, make_container, provide
from protocols.repository import Repository
from repository.config import RedisSettings
from repository.redis import RedisRepository
from usecase.get import GetKey
class RedisSettingsProvider(Provider):
@provide(scope=Scope.APP)
def redis_settings(self) -> RedisSettings:
return RedisSettings()
class SettingsProvider(Provider):
@provide(scope=Scope.APP)
def main_settings(self, redis_settings: RedisSettings) -> Settings:
return Settings(redis=redis_settings)
class RedisPoolProvider(Provider):
@provide(scope=Scope.APP)
def get_redis_pool(self, redis_settings: RedisSettings) -> redis.Redis:
return redis.from_url(redis_settings.url, decode_responses=False)
class RepositoryProvider(Provider):
@provide(scope=Scope.REQUEST)
def get_db(self, redis_pool: redis.Redis) -> Repository:
return RedisRepository(redis_pool=redis_pool)
class UseCasesProvider(Provider):
scope = Scope.REQUEST
get = provide(GetKey)
def create_container() -> Container:
return make_container(
RedisSettingsProvider(),
SettingsProvider(),
RedisPoolProvider(),
RepositoryProvider(),
UseCasesProvider(),
)

View File

@@ -1,4 +1,6 @@
from dishka.integrations.flask import setup_dishka
from flask import Flask
from ioc import create_container
from routers.key import key_bp
@@ -10,4 +12,9 @@ def app_factory() -> Flask:
if __name__ == "__main__":
app = app_factory()
app.run(debug=True)
container = create_container()
setup_dishka(container=container, app=app, auto_inject=True)
try:
app.run(debug=True, host="0.0.0.0")
finally:
container.close()

View File

@@ -1,7 +1,7 @@
from abc import abstractmethod
from typing import Protocol
from flask_demo_api.protocols.models import KeyDTO
from protocols.models import KeyDTO
class Repository(Protocol):

View File

@@ -0,0 +1,6 @@
from dataclasses import dataclass
@dataclass(frozen=True)
class RedisSettings:
url: str = "redis://redis:6379/0"

View File

@@ -1,7 +1,6 @@
import redis
from flask_demo_api.protocols.models import KeyDTO
from flask_demo_api.protocols.repository import Repository
import redis # type: ignore
from protocols.models import KeyDTO
from protocols.repository import Repository
class RedisRepository(Repository):

View File

@@ -1,5 +1,5 @@
from flask_demo_api.protocols.models import KeyDTO
from flask_demo_api.protocols.repository import Repository
from protocols.models import KeyDTO
from protocols.repository import Repository
class GetKey: