[+] add caching of generated payloads
1. fix session persistence with using Generator as Depends method; 2. implement payload_get_or_create method;
This commit is contained in:
parent
4491b1b05a
commit
a5b19cfe2a
17
deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/async_api/db.py
vendored
17
deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/async_api/db.py
vendored
@ -1,12 +1,25 @@
|
|||||||
|
import fastapi
|
||||||
|
|
||||||
from ..payloads.settings import Settings as ModelsSettings
|
from ..payloads.settings import Settings as ModelsSettings
|
||||||
|
|
||||||
import sqlalchemy.ext.asyncio
|
import sqlalchemy.ext.asyncio
|
||||||
from sqlalchemy.ext.asyncio import AsyncSession
|
from sqlalchemy.ext.asyncio import AsyncSession
|
||||||
from sqlalchemy.ext.asyncio import async_sessionmaker
|
from sqlalchemy.ext.asyncio import async_sessionmaker
|
||||||
|
|
||||||
|
from typing import (Annotated, Generator,)
|
||||||
|
|
||||||
def create_engine() -> 'async_sessionmaker[AsyncSession]':
|
|
||||||
|
def create_engine() -> Generator[
|
||||||
|
'async_sessionmaker[AsyncSession]',
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
]:
|
||||||
engine = sqlalchemy.ext.asyncio.create_async_engine(ModelsSettings.singleton().db_url)
|
engine = sqlalchemy.ext.asyncio.create_async_engine(ModelsSettings.singleton().db_url)
|
||||||
async_session = sqlalchemy.ext.asyncio.async_sessionmaker(engine)
|
async_session = sqlalchemy.ext.asyncio.async_sessionmaker(engine)
|
||||||
|
|
||||||
return async_session
|
yield async_session
|
||||||
|
|
||||||
|
AsyncSessionDep = Annotated[
|
||||||
|
'async_sessionmaker[AsyncSession]',
|
||||||
|
fastapi.Depends(create_engine)
|
||||||
|
]
|
||||||
|
10
deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/async_api/fastapi.py
vendored
10
deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/async_api/fastapi.py
vendored
@ -9,7 +9,7 @@ import uvicorn.config
|
|||||||
import sys
|
import sys
|
||||||
|
|
||||||
from .settings import Settings as APISettings
|
from .settings import Settings as APISettings
|
||||||
from .db import create_engine
|
# from .db import create_engine, async_session
|
||||||
from ..payloads.views import router as payloads_router
|
from ..payloads.views import router as payloads_router
|
||||||
# from .websocket_api import WebsocketAPI
|
# from .websocket_api import WebsocketAPI
|
||||||
|
|
||||||
@ -46,13 +46,17 @@ logger = logging.getLogger(__name__)
|
|||||||
|
|
||||||
|
|
||||||
def create_app() -> fastapi.FastAPI:
|
def create_app() -> fastapi.FastAPI:
|
||||||
async_session = create_engine()
|
# async_session = create_engine()
|
||||||
|
|
||||||
# websocket_api = WebsocketAPI(
|
# websocket_api = WebsocketAPI(
|
||||||
# session=async_session,
|
# session=async_session,
|
||||||
# )
|
# )
|
||||||
|
|
||||||
app = fastapi.FastAPI()
|
app = fastapi.FastAPI(
|
||||||
|
# dependencies=[
|
||||||
|
# fastapi.Depends(async_session),
|
||||||
|
# ]
|
||||||
|
)
|
||||||
|
|
||||||
logger.info(dict(msg='started loading apps'))
|
logger.info(dict(msg='started loading apps'))
|
||||||
for app_config in APISettings.singleton().apps:
|
for app_config in APISettings.singleton().apps:
|
||||||
|
26
deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/payloads/logic.py
vendored
26
deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/payloads/logic.py
vendored
@ -1,4 +1,6 @@
|
|||||||
import datetime
|
import datetime
|
||||||
|
import hashlib
|
||||||
|
import json
|
||||||
|
|
||||||
from sqlalchemy.ext.asyncio import AsyncSession
|
from sqlalchemy.ext.asyncio import AsyncSession
|
||||||
from sqlalchemy.ext.asyncio import async_sessionmaker
|
from sqlalchemy.ext.asyncio import async_sessionmaker
|
||||||
@ -8,6 +10,30 @@ from sqlalchemy.future import select
|
|||||||
from .models import Payload
|
from .models import Payload
|
||||||
from .utils import get_or_create
|
from .utils import get_or_create
|
||||||
|
|
||||||
|
from typing import (Optional, Any,)
|
||||||
|
|
||||||
|
async def payload_get_or_create(
|
||||||
|
session: AsyncSession,
|
||||||
|
output: list[str],
|
||||||
|
list_1: list[str],
|
||||||
|
list_2: list[str],
|
||||||
|
input_hash: Optional[str] = None,
|
||||||
|
):
|
||||||
|
if input_hash is None:
|
||||||
|
input_hash = hashlib.sha256(json.dumps(dict(
|
||||||
|
list_1=list_1,
|
||||||
|
list_2=list_2,
|
||||||
|
)).encode('utf-8')).digest().hex()
|
||||||
|
|
||||||
|
return await get_or_create(
|
||||||
|
session,
|
||||||
|
Payload,
|
||||||
|
output=output,
|
||||||
|
list_1=list_1,
|
||||||
|
list_2=list_2,
|
||||||
|
input_hash=input_hash,
|
||||||
|
)
|
||||||
|
|
||||||
# async def markets_get_by_symbol(
|
# async def markets_get_by_symbol(
|
||||||
# session: 'async_sessionmaker[AsyncSession]',
|
# session: 'async_sessionmaker[AsyncSession]',
|
||||||
# symbols: set[str],
|
# symbols: set[str],
|
||||||
|
41
deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/payloads/views.py
vendored
41
deps/test-task-2025-07-17-v2/python/online/fxreader/pr34/test_task_2025_07_17_v2/payloads/views.py
vendored
@ -1,8 +1,13 @@
|
|||||||
import fastapi
|
import fastapi
|
||||||
|
import itertools
|
||||||
|
|
||||||
from typing import (Annotated, Any,)
|
from typing import (Annotated, Any, cast, Optional,)
|
||||||
from . import schema
|
from . import schema
|
||||||
from .summarizer import SummarizerClient, SummaryRequest
|
from .summarizer import SummarizerClient, SummaryRequest
|
||||||
|
from ..async_api.db import AsyncSessionDep
|
||||||
|
from sqlalchemy.ext.asyncio import AsyncSession
|
||||||
|
from sqlalchemy.ext.asyncio import async_sessionmaker
|
||||||
|
from . import logic
|
||||||
|
|
||||||
router = fastapi.APIRouter()
|
router = fastapi.APIRouter()
|
||||||
|
|
||||||
@ -16,18 +21,46 @@ async def payload_create(
|
|||||||
list[str],
|
list[str],
|
||||||
fastapi.Body(),
|
fastapi.Body(),
|
||||||
],
|
],
|
||||||
|
session: AsyncSessionDep
|
||||||
) -> schema.Payload:
|
) -> schema.Payload:
|
||||||
data_1 = await SummarizerClient.singleton().summarize_post(
|
data_1 = (await SummarizerClient.singleton().summarize_post(
|
||||||
request=SummaryRequest(
|
request=SummaryRequest(
|
||||||
data=list_1
|
data=list_1
|
||||||
)
|
)
|
||||||
)
|
)).data
|
||||||
data_2 = await SummarizerClient.singleton().summarize_post(
|
|
||||||
|
data_2 = (await SummarizerClient.singleton().summarize_post(
|
||||||
request=SummaryRequest(
|
request=SummaryRequest(
|
||||||
data=list_2
|
data=list_2
|
||||||
)
|
)
|
||||||
|
)).data
|
||||||
|
|
||||||
|
output_len = max(len(data_1), len(data_2))
|
||||||
|
|
||||||
|
def filter_none(o: Any) -> bool:
|
||||||
|
return o is not None
|
||||||
|
|
||||||
|
output = list(
|
||||||
|
filter(
|
||||||
|
filter_none,
|
||||||
|
sum(
|
||||||
|
list(
|
||||||
|
itertools.zip_longest(data_1, data_2),
|
||||||
|
),
|
||||||
|
cast(tuple[str], tuple()),
|
||||||
|
)
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
async with session() as active_session:
|
||||||
|
async with active_session.begin() as transaction:
|
||||||
|
payload, is_created = await logic.payload_get_or_create(
|
||||||
|
active_session,
|
||||||
|
list_1=list_1,
|
||||||
|
list_2=list_2,
|
||||||
|
output=output,
|
||||||
|
)
|
||||||
|
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
@router.get('/payload/{paylaod_id}')
|
@router.get('/payload/{paylaod_id}')
|
||||||
|
Loading…
Reference in New Issue
Block a user