Rooni commited on
Commit
602fff5
·
verified ·
1 Parent(s): 4cf8c54

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +53 -13
app.py CHANGED
@@ -1,9 +1,7 @@
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,9 +14,6 @@ app = Flask(__name__)
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,10 +22,6 @@ 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,8 +38,7 @@ def scale_dimensions(width, height, max_width, max_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"
@@ -88,7 +78,7 @@ def get_image(prompt):
88
  width = request.args.get('width', type=int, default=512)
89
  height = request.args.get('height', type=int, default=512)
90
  seed = request.args.get('seed', type=int, default=22)
91
- model_name = request.args.get('model', default="black-forest-labs+FLUX.1-dev").replace('+', '/')
92
  api_key = request.args.get('key', default=None)
93
 
94
  # Декодируем URL-кодированный prompt
@@ -137,6 +127,56 @@ def get_image(prompt):
137
  mimetype='image/png'
138
  )
139
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
140
  @app.route('/')
141
  def health_check():
142
  return "OK", 200
 
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
  MAX_WIDTH = 1384
15
  MAX_HEIGHT = 1384
16
 
 
 
 
17
  # Получаем ключи из переменной окружения
18
  keys = os.getenv("keys", "").split(',')
19
  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
  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"
 
78
  width = request.args.get('width', type=int, default=512)
79
  height = request.args.get('height', type=int, default=512)
80
  seed = request.args.get('seed', type=int, default=22)
81
+ model_name = request.args.get('model', default="black-forest-labs_FLUX.1-dev").replace('_', '/')
82
  api_key = request.args.get('key', default=None)
83
 
84
  # Декодируем URL-кодированный 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