flpolprojects commited on
Commit
77fc327
·
verified ·
1 Parent(s): b4d7df8

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +57 -13
app.py CHANGED
@@ -7,6 +7,7 @@ import time
7
  from datetime import datetime
8
  from huggingface_hub import HfApi, hf_hub_download
9
  from huggingface_hub.utils import RepositoryNotFoundError
 
10
 
11
  app = Flask(__name__)
12
  DATA_FILE = 'products.json'
@@ -35,12 +36,11 @@ def load_data():
35
  return []
36
  except RepositoryNotFoundError:
37
  logging.error("Репозиторий не найден. Создание локальной базы данных.")
38
- return [] # Возвращаем пустой список, чтобы начать с пустой базы
39
  except Exception as e:
40
  logging.error(f"Произошла ошибка при загрузке данных: {e}")
41
  return []
42
 
43
-
44
  def save_data(data):
45
  """Сохраняет данные в JSON-файл."""
46
  try:
@@ -81,13 +81,13 @@ def download_db_from_hf():
81
  logging.info("JSON база успешно скачана из Hugging Face.")
82
  except RepositoryNotFoundError as e:
83
  logging.error(f"Репозиторий не найден: {e}")
84
- raise # Прокидываем исключение выше, чтобы load_data обработал его
85
  except Exception as e:
86
  logging.error(f"Ошибка при скачивании JSON базы: {e}")
87
- raise # Прокидываем исключение выше, чтобы load_data обработал его
88
 
89
  def periodic_backup():
90
- """Периодически вызывает функцию upload_db_to_hf() каждые 100 секунд."""
91
  while True:
92
  upload_db_to_hf()
93
  time.sleep(15)
@@ -98,7 +98,7 @@ def catalog():
98
  products = load_data()
99
  catalog_html = '''
100
  <!DOCTYPE html>
101
- <html lang="en">
102
  <head>
103
  <meta charset="UTF-8">
104
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
@@ -126,6 +126,12 @@ def catalog():
126
  .product p {
127
  color: #777;
128
  }
 
 
 
 
 
 
129
  </style>
130
  </head>
131
  <body>
@@ -135,12 +141,15 @@ def catalog():
135
  <h2>{{ product['name'] }}</h2>
136
  <p><strong>Цена:</strong> {{ product['price'] }} руб.</p>
137
  <p><strong>Описание:</strong> {{ product['description'] }}</p>
 
 
 
138
  </div>
139
  {% endfor %}
140
  </body>
141
  </html>
142
  '''
143
- return render_template_string(catalog_html, products=products)
144
 
145
  @app.route('/admin', methods=['GET', 'POST'])
146
  def admin():
@@ -148,9 +157,38 @@ def admin():
148
  name = request.form.get('name')
149
  price = request.form.get('price')
150
  description = request.form.get('description')
 
151
 
152
  logging.debug(f"Полученные данные из формы: name={name}, price={price}, description={description}")
153
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
154
  if name and price and description:
155
  try:
156
  price = float(price.replace(',', '.'))
@@ -159,11 +197,15 @@ def admin():
159
  return "Ошибка: Цена должна быть числом.", 400
160
 
161
  products = load_data()
162
- products.append({
163
  'name': name,
164
  'price': price,
165
  'description': description
166
- })
 
 
 
 
167
 
168
  try:
169
  save_data(products)
@@ -172,10 +214,9 @@ def admin():
172
 
173
  return redirect(url_for('admin'))
174
 
175
- products = load_data()
176
  admin_html = '''
177
  <!DOCTYPE html>
178
- <html lang="en">
179
  <head>
180
  <meta charset="UTF-8">
181
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
@@ -224,7 +265,7 @@ def admin():
224
  </head>
225
  <body>
226
  <h1>Добавление товара</h1>
227
- <form method="POST">
228
  <label for="name">Название товара:</label>
229
  <input type="text" id="name" name="name" required>
230
 
@@ -234,6 +275,9 @@ def admin():
234
  <label for="description">Описание:</label>
235
  <textarea id="description" name="description" rows="4" required></textarea>
236
 
 
 
 
237
  <button type="submit">Добавить товар</button>
238
  </form>
239
 
@@ -278,4 +322,4 @@ if __name__ == '__main__':
278
  # Здесь можно добавить логику для создания пустой базы данных, если это необходимо
279
  # Например: save_data([])
280
 
281
- app.run(debug=True, host='0.0.0.0', port=7860)
 
7
  from datetime import datetime
8
  from huggingface_hub import HfApi, hf_hub_download
9
  from huggingface_hub.utils import RepositoryNotFoundError
10
+ from werkzeug.utils import secure_filename
11
 
12
  app = Flask(__name__)
13
  DATA_FILE = 'products.json'
 
36
  return []
37
  except RepositoryNotFoundError:
38
  logging.error("Репозиторий не найден. Создание локальной базы данных.")
39
+ return [] # Возвращаем пустой список, чтобы начать с пустой базы
40
  except Exception as e:
41
  logging.error(f"Произошла ошибка при загрузке данных: {e}")
42
  return []
43
 
 
44
  def save_data(data):
45
  """Сохраняет данные в JSON-файл."""
46
  try:
 
81
  logging.info("JSON база успешно скачана из Hugging Face.")
82
  except RepositoryNotFoundError as e:
83
  logging.error(f"Репозиторий не найден: {e}")
84
+ raise # Прокидываем исключение выше, чтобы load_data обработал его
85
  except Exception as e:
86
  logging.error(f"Ошибка при скачивании JSON базы: {e}")
87
+ raise
88
 
89
  def periodic_backup():
90
+ """Периодически вызывает функцию upload_db_to_hf() каждые 15 секунд."""
91
  while True:
92
  upload_db_to_hf()
93
  time.sleep(15)
 
98
  products = load_data()
99
  catalog_html = '''
100
  <!DOCTYPE html>
101
+ <html lang="ru">
102
  <head>
103
  <meta charset="UTF-8">
104
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
 
126
  .product p {
127
  color: #777;
128
  }
129
+ .product img {
130
+ max-width: 200px;
131
+ margin-top: 10px;
132
+ border: 1px solid #ccc;
133
+ border-radius: 4px;
134
+ }
135
  </style>
136
  </head>
137
  <body>
 
141
  <h2>{{ product['name'] }}</h2>
142
  <p><strong>Цена:</strong> {{ product['price'] }} руб.</p>
143
  <p><strong>Описание:</strong> {{ product['description'] }}</p>
144
+ {% if product.get('photo') %}
145
+ <img src="https://huggingface.co/datasets/{{ repo_id }}/resolve/main/photos/{{ product['photo'] }}" alt="{{ product['name'] }}">
146
+ {% endif %}
147
  </div>
148
  {% endfor %}
149
  </body>
150
  </html>
151
  '''
152
+ return render_template_string(catalog_html, products=products, repo_id=REPO_ID)
153
 
154
  @app.route('/admin', methods=['GET', 'POST'])
155
  def admin():
 
157
  name = request.form.get('name')
158
  price = request.form.get('price')
159
  description = request.form.get('description')
160
+ photo = request.files.get('photo')
161
 
162
  logging.debug(f"Полученные данные из формы: name={name}, price={price}, description={description}")
163
 
164
+ photo_filename = None
165
+ if photo and photo.filename:
166
+ photo_filename = secure_filename(photo.filename)
167
+ # Сохраняем файл временно в папку uploads
168
+ uploads_dir = 'uploads'
169
+ os.makedirs(uploads_dir, exist_ok=True)
170
+ temp_path = os.path.join(uploads_dir, photo_filename)
171
+ photo.save(temp_path)
172
+
173
+ # Загружаем фото в репозиторий в папку "photos"
174
+ try:
175
+ api = HfApi()
176
+ api.upload_file(
177
+ path_or_fileobj=temp_path,
178
+ path_in_repo=f"photos/{photo_filename}",
179
+ repo_id=REPO_ID,
180
+ repo_type="dataset",
181
+ token=HF_TOKEN_WRITE,
182
+ commit_message=f"Добавлено фото для товара {name} {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
183
+ )
184
+ logging.info("Фото успешно загружено в репозиторий.")
185
+ except Exception as e:
186
+ logging.error(f"Ошибка при загрузке фото: {e}")
187
+ return f"Ошибка при загрузке фото: {e}", 500
188
+ finally:
189
+ # Удаляем временный файл
190
+ os.remove(temp_path)
191
+
192
  if name and price and description:
193
  try:
194
  price = float(price.replace(',', '.'))
 
197
  return "Ошибка: Цена должна быть числом.", 400
198
 
199
  products = load_data()
200
+ product_entry = {
201
  'name': name,
202
  'price': price,
203
  'description': description
204
+ }
205
+ if photo_filename:
206
+ product_entry['photo'] = photo_filename
207
+
208
+ products.append(product_entry)
209
 
210
  try:
211
  save_data(products)
 
214
 
215
  return redirect(url_for('admin'))
216
 
 
217
  admin_html = '''
218
  <!DOCTYPE html>
219
+ <html lang="ru">
220
  <head>
221
  <meta charset="UTF-8">
222
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
 
265
  </head>
266
  <body>
267
  <h1>Добавление товара</h1>
268
+ <form method="POST" enctype="multipart/form-data">
269
  <label for="name">Название товара:</label>
270
  <input type="text" id="name" name="name" required>
271
 
 
275
  <label for="description">Описание:</label>
276
  <textarea id="description" name="description" rows="4" required></textarea>
277
 
278
+ <label for="photo">Фотография товара (необязательно):</label>
279
+ <input type="file" id="photo" name="photo" accept="image/*">
280
+
281
  <button type="submit">Добавить товар</button>
282
  </form>
283
 
 
322
  # Здесь можно добавить логику для создания пустой базы данных, если это необходимо
323
  # Например: save_data([])
324
 
325
+ app.run(debug=True, host='0.0.0.0', port=7860)