Spaces:
Running
Running
File size: 3,903 Bytes
636dc45 1cde8f8 636dc45 1cde8f8 2248ec1 1cde8f8 636dc45 1cde8f8 636dc45 1cde8f8 636dc45 2248ec1 1cde8f8 7b4545e 2248ec1 1cde8f8 636dc45 1cde8f8 aa1641b 1cde8f8 636dc45 1cde8f8 2248ec1 1cde8f8 636dc45 1cde8f8 aa1641b 1cde8f8 636dc45 1cde8f8 2248ec1 1cde8f8 636dc45 f8d4bdd 636dc45 1cde8f8 636dc45 1cde8f8 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
from flask import Flask, request, jsonify
from deep_translator import GoogleTranslator
from langdetect import detect, LangDetectException
import logging
from cachetools import TTLCache
import hashlib
app = Flask(__name__)
# Настройка кэширования
cache = TTLCache(maxsize=1024, ttl=86400) # Максимальный размер кэша 1024, срок жизни 24 часа (86400 секунд)
# Настройка логирования
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
def generate_cache_key(text):
"""Генерирует ключ для кэша на основе текста."""
return hashlib.md5(text.encode('utf-8')).hexdigest()
def translate_text(text):
"""
Определяет язык текста и переводит его на английский, если необходимо,
используя кэширование результатов с TTLCache.
Args:
text (str): Текст для перевода.
Returns:
dict: Словарь с результатом перевода или оригинальным текстом, а также информацией об ошибке.
Формат: {"result": "переведенный текст", "original": "исходный текст", "error": null/сообщение об ошибке}
"""
cache_key = generate_cache_key(text)
cached_result = cache.get(cache_key)
if cached_result:
app.logger.info(f"Cache hit for key: {cache_key}")
return cached_result
try:
language = detect(text)
app.logger.info(f"Detected language: {language}")
except LangDetectException as e:
app.logger.error(f"Error detecting language: {e}")
result = {"result": text, "original": text, "error": f"Error detecting language: {e}"}
# cache[cache_key] = result # Кэшируем ошибку
return result
if language != 'en':
try:
translator = GoogleTranslator(source=language, target='en')
translated_text = translator.translate(text)
app.logger.info(f"Translated from {language} to en")
result = {"result": translated_text, "original": text, "error": None}
cache[cache_key] = result # Кэшируем результат
return result
except Exception as e:
app.logger.error(f"Error translating prompt: {e}")
result = {"result": text, "original": text, "error": f"Error translating text: {e}"}
# cache[cache_key] = result # Кэшируем ошибку
return result
else:
app.logger.info("Text is already in English")
result = {"result": text, "original": text, "error": None}
cache[cache_key] = result # Кэшируем результат
return result
@app.route('/', methods=['POST'])
def translate_endpoint():
"""
Эндпоинт для обработки POST запросов.
Ожидает текст в теле запроса и возвращает перевод или оригинал в формате JSON.
"""
if request.is_json:
try:
data = request.get_json()
text = data.get('text')
if not text:
return jsonify({"error": "No text provided in request body"}), 400
translation_result = translate_text(text)
return jsonify(translation_result), 200
except Exception as e:
app.logger.error(f"Error processing request: {e}")
return jsonify({"error": f"Error processing request: {e}"}), 500
else:
return jsonify({"error": "Request must be in json format"}), 400
if __name__ == '__main__':
app.run(host='0.0.0.0', port=7860, debug=True) |