Rooni commited on
Commit
6af9ebe
·
verified ·
1 Parent(s): 2d66a7e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +12 -52
app.py CHANGED
@@ -1,7 +1,9 @@
1
- from flask import Flask, request, send_file, render_template, abort
2
  import requests
3
  import io
4
  from PIL import Image
 
 
5
  import os
6
  import urllib.parse
7
  import hashlib
@@ -14,6 +16,9 @@ app = Flask(__name__)
14
  MAX_WIDTH = 1384
15
  MAX_HEIGHT = 1384
16
 
 
 
 
17
  # Получаем ключи из переменной окружения
18
  keys = os.getenv("keys", "").split(',')
19
  if not keys:
@@ -22,6 +27,10 @@ if not keys:
22
  def get_random_key():
23
  return random.choice(keys)
24
 
 
 
 
 
25
  def scale_dimensions(width, height, max_width, max_height):
26
  """Масштабирует размеры изображения, сохраняя соотношение сторон, и округляет до чисел, кратных 8."""
27
  aspect_ratio = width / height
@@ -38,7 +47,8 @@ def scale_dimensions(width, height, max_width, max_height):
38
  height = (height + 3) // 8 * 8
39
  return width, height
40
 
41
- def generate_image(prompt, width, height, seed, model_name, api_key):
 
42
  headers = {
43
  "Authorization": f"Bearer {api_key}",
44
  "Content-Type": "application/json"
@@ -127,56 +137,6 @@ def get_image(prompt):
127
  mimetype='image/png'
128
  )
129
 
130
- @app.route('/play', methods=['GET', 'POST'])
131
- def play():
132
- if request.method == 'POST':
133
- prompt = request.form.get('prompt', default="")
134
- width = request.form.get('width', type=int, default=512)
135
- height = request.form.get('height', type=int, default=512)
136
- seed = request.form.get('seed', type=int, default=22)
137
- model_name = request.form.get('model', default="black-forest-labs_FLUX.1-dev").replace('_', '/')
138
- api_key = request.form.get('key', default=None)
139
-
140
- # Определяем язык промпта
141
- try:
142
- language = detect(prompt)
143
- except Exception as e:
144
- app.logger.error(f"Error detecting language: {e}")
145
- return send_error_image()
146
-
147
- # Переводим промпт, если он не на английском языке
148
- if language != 'en':
149
- try:
150
- translator = GoogleTranslator(source=language, target='en')
151
- prompt = translator.translate(prompt)
152
- except Exception as e:
153
- app.logger.error(f"Error translating prompt: {e}")
154
- return send_error_image()
155
-
156
- # Масштабируем размеры изображения, если они превышают максимальные значения, и округляем до чисел, кратных 8
157
- width, height = scale_dimensions(width, height, MAX_WIDTH, MAX_HEIGHT)
158
-
159
- # Используем указанный ключ, если он предоставлен, иначе выбираем случайный ключ
160
- if api_key is None:
161
- api_key = get_random_key()
162
-
163
- # Генерируем изображение без кэширования
164
- image = generate_image(prompt, width, height, seed, model_name, api_key)
165
- if image is None:
166
- return send_error_image()
167
-
168
- img_byte_arr = io.BytesIO()
169
- image.save(img_byte_arr, format='PNG')
170
- img_byte_arr = img_byte_arr.getvalue()
171
-
172
- return send_file(
173
- io.BytesIO(img_byte_arr),
174
- mimetype='image/png'
175
- )
176
-
177
- # GET запрос - отображаем форму
178
- return render_template('play.html')
179
-
180
  @app.route('/')
181
  def health_check():
182
  return "OK", 200
 
1
+ from flask import Flask, request, send_file, abort
2
  import requests
3
  import io
4
  from PIL import Image
5
+ from cachetools import TTLCache, cached
6
+ import random
7
  import os
8
  import urllib.parse
9
  import hashlib
 
16
  MAX_WIDTH = 1384
17
  MAX_HEIGHT = 1384
18
 
19
+ # Кэш на 10 минут
20
+ cache = TTLCache(maxsize=100, ttl=600)
21
+
22
  # Получаем ключи из переменной окружения
23
  keys = os.getenv("keys", "").split(',')
24
  if not keys:
 
27
  def get_random_key():
28
  return random.choice(keys)
29
 
30
+ def generate_cache_key(prompt, width, height, seed, model_name):
31
+ # Создаем уникальный ключ на основе всех параметров, кроме ключа API
32
+ return hashlib.md5(f"{prompt}_{width}_{height}_{seed}_{model_name}".encode()).hexdigest()
33
+
34
  def scale_dimensions(width, height, max_width, max_height):
35
  """Масштабирует размеры изображения, сохраняя соотношение сторон, и округляет до чисел, кратных 8."""
36
  aspect_ratio = width / height
 
47
  height = (height + 3) // 8 * 8
48
  return width, height
49
 
50
+ @cached(cache)
51
+ def generate_cached_image(cache_key, prompt, width, height, seed, model_name, api_key):
52
  headers = {
53
  "Authorization": f"Bearer {api_key}",
54
  "Content-Type": "application/json"
 
137
  mimetype='image/png'
138
  )
139
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
140
  @app.route('/')
141
  def health_check():
142
  return "OK", 200