flpolprojects commited on
Commit
c9097d0
·
verified ·
1 Parent(s): 7cc51ba

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +55 -98
app.py CHANGED
@@ -24,6 +24,7 @@ logging.basicConfig(level=logging.DEBUG)
24
  def load_data():
25
  """Загружает данные из JSON-файла или скачивает их из репозитория Hugging Face."""
26
  try:
 
27
  download_db_from_hf()
28
  with open(DATA_FILE, 'r', encoding='utf-8') as file:
29
  return json.load(file)
@@ -95,138 +96,90 @@ def periodic_backup():
95
  @app.route('/')
96
  def catalog():
97
  products = load_data()
98
-
99
- # Pagination setup
100
- page = request.args.get('page', 1, type=int)
101
- per_page = 12 # Количество товаров на странице
102
-
103
- # Calculate start and end indices for the current page
104
- start = (page - 1) * per_page
105
- end = start + per_page
106
-
107
- # Slice the products list for the current page
108
- paginated_products = products[start:end]
109
-
110
- # Calculate total number of pages
111
- total_products = len(products)
112
- total_pages = (total_products + per_page - 1) // per_page
113
-
114
  catalog_html = '''
115
  <!DOCTYPE html>
116
  <html lang="ru">
117
  <head>
118
  <meta charset="UTF-8">
119
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
120
- <title>Каталог</title>
121
  <style>
122
  body {
123
  font-family: Arial, sans-serif;
124
  margin: 0;
125
- padding: 20px;
126
  background-color: #f9f9f9;
127
  }
128
- h1 {
 
 
 
129
  text-align: center;
130
- color: #333;
131
- margin-bottom: 20px;
132
  }
133
- .grid-container {
 
 
 
134
  display: grid;
135
- grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
136
- gap: 20px;
137
- margin-bottom: 20px;
138
  }
139
  .product-card {
140
- background-color: white;
141
- border-radius: 8px;
142
- box-shadow: 0 2px 5px rgba(0,0,0,0.1);
143
  padding: 15px;
144
- text-align: center;
145
- transition: transform 0.2s ease-in-out;
 
146
  }
147
  .product-card:hover {
148
- transform: scale(1.05);
149
- }
150
- .product-card img {
151
- max-width: 100%;
152
- height: auto;
153
- border-radius: 5px;
154
- margin-bottom: 10px;
155
  }
156
  .product-card h2 {
157
- font-size: 18px;
158
- color: #555;
159
- margin-bottom: 10px;
160
  }
161
  .product-card p {
162
- font-size: 14px;
163
- color: #777;
164
- margin-bottom: 5px;
165
- }
166
- .pagination {
167
- text-align: center;
168
- margin-top: 20px;
169
  }
170
- .pagination a {
171
- display: inline-block;
172
- padding: 10px 15px;
173
- text-decoration: none;
174
  border-radius: 5px;
175
- border: 1px solid #ddd;
176
- color: #333;
177
- background-color: white;
178
- margin-right: 5px;
179
- }
180
- .pagination a.active {
181
- background-color: #4CAF50;
182
- color: white;
183
- border-color: #4CAF50;
184
  }
185
- .pagination a:hover:not(.active) {
186
- background-color: #ddd;
 
 
187
  }
188
  </style>
189
  </head>
190
  <body>
191
- <h1>Каталог товаров</h1>
192
-
193
- <div class="grid-container">
194
- {% for product in paginated_products %}
195
- <div class="product-card">
196
- <h2>{{ product['name'] }}</h2>
197
- {% if product.get('photo') %}
198
- <img src="https://huggingface.co/datasets/{{ repo_id }}/resolve/main/photos/{{ product['photo'] }}" alt="{{ product['name'] }}">
199
- {% endif %}
200
- <p><strong>Цена:</strong> {{ product['price'] }} руб.</p>
201
- <p>{{ product['description'] }}</p>
 
 
 
 
202
  </div>
203
- {% endfor %}
204
  </div>
205
-
206
- <!-- Pagination -->
207
- <div class="pagination">
208
- {% if page > 1 %}
209
- <a href="{{ url_for('catalog', page=page-1) }}">Назад</a>
210
- {% endif %}
211
-
212
- {% for p in range(1, total_pages + 1) %}
213
- {% if p == page %}
214
- <a class="active">{{ p }}</a>
215
- {% else %}
216
- <a href="{{ url_for('catalog', page=p) }}">{{ p }}</a>
217
- {% endif %}
218
- {% endfor %}
219
-
220
- {% if page < total_pages %}
221
- <a href="{{ url_for('catalog', page=page+1) }}">Вперед</a>
222
- {% endif %}
223
- </div>
224
-
225
  </body>
226
  </html>
227
  '''
228
-
229
- return render_template_string(catalog_html, paginated_products=paginated_products, repo_id=REPO_ID, page=page, total_pages=total_pages)
230
 
231
  @app.route('/admin', methods=['GET', 'POST'])
232
  def admin():
@@ -497,12 +450,16 @@ def download():
497
  return "База данных успешно скачана.", 200
498
 
499
  if __name__ == '__main__':
 
500
  backup_thread = threading.Thread(target=periodic_backup, daemon=True)
501
  backup_thread.start()
502
 
 
503
  try:
504
  load_data()
505
  except Exception as e:
506
- logging.error(f"Не удалось загрузить базу данных при запуске приложения. Ошибка: {e}")
 
 
507
 
508
- app.run(debug=True, host='0.0.0.0', port=7860)
 
24
  def load_data():
25
  """Загружает данные из JSON-файла или скачивает их из репозитория Hugging Face."""
26
  try:
27
+ # Пытаемся скачать базу данных из Hugging Face
28
  download_db_from_hf()
29
  with open(DATA_FILE, 'r', encoding='utf-8') as file:
30
  return json.load(file)
 
96
  @app.route('/')
97
  def catalog():
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">
105
+ <title>Каталог товаров</title>
106
  <style>
107
  body {
108
  font-family: Arial, sans-serif;
109
  margin: 0;
110
+ padding: 0;
111
  background-color: #f9f9f9;
112
  }
113
+ header {
114
+ background-color: #4CAF50;
115
+ color: white;
116
+ padding: 15px;
117
  text-align: center;
 
 
118
  }
119
+ .container {
120
+ padding: 20px;
121
+ }
122
+ .catalog-container {
123
  display: grid;
124
+ grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
125
+ grid-gap: 20px;
 
126
  }
127
  .product-card {
128
+ background-color: #fff;
129
+ border: 1px solid #ddd;
 
130
  padding: 15px;
131
+ border-radius: 8px;
132
+ box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
133
+ transition: transform 0.2s, box-shadow 0.2s;
134
  }
135
  .product-card:hover {
136
+ transform: scale(1.02);
137
+ box-shadow: 0 4px 10px rgba(0, 0, 0, 0.15);
 
 
 
 
 
138
  }
139
  .product-card h2 {
140
+ margin-top: 0;
141
+ font-size: 1.2em;
142
+ color: #333;
143
  }
144
  .product-card p {
145
+ font-size: 0.95em;
146
+ color: #555;
 
 
 
 
 
147
  }
148
+ .product-card img {
149
+ width: 100%;
150
+ height: auto;
151
+ margin-top: 10px;
152
  border-radius: 5px;
 
 
 
 
 
 
 
 
 
153
  }
154
+ @media (max-width: 600px) {
155
+ .catalog-container {
156
+ grid-template-columns: 1fr;
157
+ }
158
  }
159
  </style>
160
  </head>
161
  <body>
162
+ <header>
163
+ <h1>Каталог товаров</h1>
164
+ </header>
165
+ <div class="container">
166
+ <div class="catalog-container">
167
+ {% for product in products %}
168
+ <div class="product-card">
169
+ <h2>{{ product['name'] }}</h2>
170
+ <p><strong>Цена:</strong> {{ product['price'] }} руб.</p>
171
+ <p><strong>Описание:</strong> {{ product['description'] }}</p>
172
+ {% if product.get('photo') %}
173
+ <img src="https://huggingface.co/datasets/{{ repo_id }}/resolve/main/photos/{{ product['photo'] }}" alt="{{ product['name'] }}">
174
+ {% endif %}
175
+ </div>
176
+ {% endfor %}
177
  </div>
 
178
  </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
179
  </body>
180
  </html>
181
  '''
182
+ return render_template_string(catalog_html, products=products, repo_id=REPO_ID)
 
183
 
184
  @app.route('/admin', methods=['GET', 'POST'])
185
  def admin():
 
450
  return "База данных успешно скачана.", 200
451
 
452
  if __name__ == '__main__':
453
+ # Запуск фонового потока для периодического резервного копирования
454
  backup_thread = threading.Thread(target=periodic_backup, daemon=True)
455
  backup_thread.start()
456
 
457
+ # Попытка загрузить базу данных из репозитория перед запуском приложения
458
  try:
459
  load_data()
460
  except Exception as e:
461
+ logging.error(f"Не удалось загрузить базу данных при запуске: {e}")
462
+ # Здесь можно добавить логику для создания пустой базы данных, если это необходимо
463
+ # Например: save_data([])
464
 
465
+ app.run(debug=True, host='0.0.0.0', port=7860)