diff --git a/cache/precache.py b/cache/precache.py index e692678c..5270caf2 100644 --- a/cache/precache.py +++ b/cache/precache.py @@ -10,6 +10,7 @@ from orm.topic import Topic, TopicFollower from resolvers.stat import get_with_stat from services.db import local_session from services.redis import redis +from settings import REDIS_URL from utils.encoders import CustomJSONEncoder from utils.logger import root_logger as logger @@ -81,7 +82,7 @@ async def precache_data(): # cache reset value = await redis.get(key) await redis.execute("FLUSHDB") - logger.info("redis flushed") + logger.info(f"FLUSHDB {REDIS_URL}") if value is not None: await redis.execute("HSET", key, value) logger.info(f"Значение ключа '{key}' сохранено") diff --git a/main.py b/main.py index f819b07b..9b27b455 100644 --- a/main.py +++ b/main.py @@ -1,3 +1,4 @@ +import asyncio import os from importlib import import_module from os.path import exists @@ -6,6 +7,7 @@ from ariadne import load_schema_from_path, make_executable_schema from ariadne.asgi import GraphQL from starlette.applications import Starlette from starlette.routing import Route +from starlette.responses import JSONResponse from cache.precache import precache_data from cache.revalidator import revalidation_manager @@ -45,10 +47,21 @@ def create_all_tables(): create_table_if_not_exists(engine, model) +# Оборачиваем GraphQL-обработчик для лучшей обработки ошибок +async def graphql_handler(request): + try: + graphql_app = GraphQL(schema, debug=True) + return await graphql_app(request) + except asyncio.CancelledError: + return JSONResponse({"error": "Request cancelled"}, status_code=499) + except Exception as e: + return JSONResponse({"error": str(e)}, status_code=500) + + # main starlette app object with ariadne mounted in root app = Starlette( routes=[ - Route("/", GraphQL(schema, debug=True)), + Route("/", graphql_handler), Route("/new-author", WebhookEndpoint), ], on_startup=[ diff --git a/pyproject.toml b/pyproject.toml index a8500fee..304da157 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,7 +12,7 @@ SQLAlchemy = "^2.0.29" psycopg2-binary = "^2.9.9" redis = {extras = ["hiredis"], version = "^5.0.1"} sentry-sdk = {version = "^1.44.1", extras = ["starlette", "ariadne", "sqlalchemy"]} -starlette = "^0.37.2" +starlette = "^0.39.2" gql = "^3.5.0" ariadne = "^0.23.0" pre-commit = "^3.7.0" diff --git a/services/viewed.py b/services/viewed.py index 762e6253..cc2730bc 100644 --- a/services/viewed.py +++ b/services/viewed.py @@ -55,7 +55,7 @@ class ViewedStorage: # Запуск фоновой задачи _task = asyncio.create_task(self.worker()) else: - logger.info(" * Пожалуйста, добавьте ключевой файл Google Analytics") + logger.warning(" * Пожалуйста, добавьте ключевой файл Google Analytics") self.disabled = True @staticmethod @@ -79,7 +79,7 @@ class ViewedStorage: self.views_by_shout.update(precounted_views) logger.info(f" * {len(precounted_views)} публикаций с просмотрами успешно загружены.") else: - logger.info(" * Файл просмотров не найден.") + logger.warning(" * Файл просмотров не найден.") except Exception as e: logger.error(f"Ошибка загрузки предварительно подсчитанных просмотров: {e}")