toxic-detector/app/api/routes.py

55 lines
2.5 KiB
Python
Raw Normal View History

2024-10-22 23:22:01 +02:00
from fastapi import APIRouter, HTTPException
2024-10-22 22:51:03 +02:00
from app.models.schemas import TextInput, ToxicityOutput
from app.core.cache import cache
2024-10-23 00:07:56 +02:00
from app.core.text_preprocessing import preprocess_text
2024-10-22 22:51:03 +02:00
import json
import hashlib
import logging
from app.tasks import assess_toxicity_task
router = APIRouter()
logger = logging.getLogger(__name__)
def get_cache_key(text: str) -> str:
"""Генерация уникального ключа для кеша на основе текста."""
return f"toxicity:{hashlib.sha256(text.encode()).hexdigest()}"
@router.post("/toxicity", response_model=ToxicityOutput, summary="Оценка токсичности текста", response_description="Оценка токсичности")
async def assess_toxicity(input: TextInput):
"""
Принимает текст и возвращает оценку его токсичности.
- **text**: Текст для оценки
"""
2024-10-23 00:07:56 +02:00
try:
preprocessed_text = preprocess_text(input.text)
logger.info(f"Текст после предобработки: {preprocessed_text}")
except Exception as e:
logger.error(f"Ошибка при предобработке текста: {e}")
raise HTTPException(status_code=400, detail="Ошибка при предобработке текста.")
cache_key = get_cache_key(preprocessed_text)
2024-10-22 22:51:03 +02:00
cached_result = await cache.get(cache_key)
if cached_result:
try:
toxicity_score = json.loads(cached_result)
logger.info(f"Получен результат из кеша для ключа {cache_key}: {toxicity_score}")
return {"toxicity_score": toxicity_score}
except json.JSONDecodeError:
logger.warning(f"Кеш для ключа {cache_key} повреждён. Переходим к обработке.")
try:
2024-10-23 00:07:56 +02:00
result = assess_toxicity_task.delay(preprocessed_text)
logger.info(f"Задача отправлена в очередь Celery для текста: {preprocessed_text}")
2024-10-23 00:10:51 +02:00
toxicity_score = result.get(timeout=5)
2024-10-22 22:51:03 +02:00
await cache.set(cache_key, json.dumps(toxicity_score))
logger.info(f"Результат сохранён в кеш для ключа {cache_key}: {toxicity_score}")
return {"toxicity_score": toxicity_score}
except Exception as e:
logger.error(f"Ошибка при обработке текста: {e}")
2024-10-23 00:07:56 +02:00
raise HTTPException(status_code=500, detail="Ошибка при оценке токсичности текста.")