flpolprojects commited on
Commit
e35954f
·
verified ·
1 Parent(s): 076b99d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +34 -49
app.py CHANGED
@@ -24,7 +24,6 @@ logging.basicConfig(level=logging.DEBUG)
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,20 +95,22 @@ def periodic_backup():
96
  @app.route('/')
97
  def catalog():
98
  products = load_data()
 
99
  # Pagination setup
100
  page = request.args.get('page', 1, type=int)
101
  per_page = 10 # 10 products per column
102
-
103
  # Calculate start and end indices for the current page
104
- start = (page - 1) * per_page * 3 # 3 columns
105
  end = start + per_page * 3
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 * 3) - 1) // (per_page * 3)
 
113
  catalog_html = '''
114
  <!DOCTYPE html>
115
  <html lang="ru">
@@ -125,40 +126,29 @@ def catalog():
125
  }
126
  h1 {
127
  color: #333;
128
- text-align: center; /* Center the header */
129
  }
130
  .container {
131
  display: flex;
132
  flex-wrap: wrap;
133
- justify-content: space-around; /* Distribute items evenly */
134
- }
135
- .column {
136
- width: 30%; /* Adjust for three columns with some spacing */
137
- margin-bottom: 20px;
138
  }
139
  .product {
 
140
  background-color: #fff;
141
  border: 1px solid #ddd;
142
  padding: 15px;
143
- margin-bottom: 10px;
144
  border-radius: 5px;
145
- text-align: center; /* Center product content */
146
- }
147
- .product h2 {
148
- margin-top: 0;
149
- color: #555;
150
- }
151
- .product p {
152
- color: #777;
153
  }
154
  .product img {
155
- max-width: 100%; /* Make images responsive */
156
  height: auto;
157
- border: 1px solid #ccc;
158
- border-radius: 4px;
159
  margin-bottom: 10px;
160
  }
161
- /* Pagination styles */
162
  .pagination {
163
  text-align: center;
164
  margin-top: 20px;
@@ -170,11 +160,12 @@ def catalog():
170
  border: 1px solid #ddd;
171
  color: #333;
172
  background-color: white;
 
173
  }
174
  .pagination a.active {
175
  background-color: #4CAF50;
176
  color: white;
177
- border: 1px solid #4CAF50;
178
  }
179
  .pagination a:hover:not(.active) {
180
  background-color: #ddd;
@@ -183,46 +174,44 @@ def catalog():
183
  </head>
184
  <body>
185
  <h1>Каталог товаров</h1>
 
186
  <div class="container">
187
  {% for product in paginated_products %}
188
- {% if loop.index0 % 10 == 0 and loop.index0 != 0 %}
189
- </div><div class="column"> <!-- Start a new column every 10 products -->
190
- {% elif loop.index0 % 30 == 0 %}
191
- <div class="column"> <!-- Start the first column -->
192
- {% endif %}
193
- <div class="product">
194
- <h2>{{ product['name'] }}</h2>
195
  <img src="https://huggingface.co/datasets/{{ repo_id }}/resolve/main/photos/{{ product['photo'] }}" alt="{{ product['name'] }}">
196
- <p><strong>Цена:</strong> {{ product['price'] }} руб.</p>
197
- <p><strong>Описание:</strong> {{ product['description'] }}</p>
198
- </div>
199
- {% if loop.index0 % 10 == 9 or loop.last %}
200
- </div> <!-- Close the column -->
201
  {% endif %}
 
 
 
202
  {% endfor %}
203
  </div>
204
- <!-- Pagination links -->
 
205
  <div class="pagination">
206
  {% if page > 1 %}
207
  <a href="{{ url_for('catalog', page=page-1) }}">Назад</a>
208
  {% endif %}
209
 
210
- {% for page_num in range(1, total_pages + 1) %}
211
- {% if page_num == page %}
212
- <a class="active" href="{{ url_for('catalog', page=page_num) }}">{{ page_num }}</a>
213
  {% else %}
214
- <a href="{{ url_for('catalog', page=page_num) }}">{{ page_num }}</a>
215
  {% endif %}
216
  {% endfor %}
217
-
218
  {% if page < total_pages %}
219
  <a href="{{ url_for('catalog', page=page+1) }}">Вперед</a>
220
  {% endif %}
221
  </div>
 
222
  </body>
223
  </html>
224
  '''
225
- return render_template_string(catalog_html, products=paginated_products, repo_id=REPO_ID, page=page, total_pages=total_pages)
 
226
 
227
  @app.route('/admin', methods=['GET', 'POST'])
228
  def admin():
@@ -493,16 +482,12 @@ def download():
493
  return "База данных успешно скачана.", 200
494
 
495
  if __name__ == '__main__':
496
- # Запуск фонового потока для периодического резервного копирования
497
  backup_thread = threading.Thread(target=periodic_backup, daemon=True)
498
  backup_thread.start()
499
 
500
- # Попытка загрузить базу данных из репозитория перед запуском приложения
501
  try:
502
  load_data()
503
  except Exception as e:
504
- logging.error(f"Не удалось загрузить базу данных при запуске: {e}")
505
- # Здесь можно добавить логику для создания пустой базы данных, если это необходимо
506
- # Например: save_data([])
507
 
508
  app.run(debug=True, host='0.0.0.0', port=7860)
 
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
  @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 = 10 # 10 products per column
102
+
103
  # Calculate start and end indices for the current page
104
+ start = (page - 1) * per_page * 3 # 3 columns per row
105
  end = start + per_page * 3
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 * 3) - 1) // (per_page * 3)
113
+
114
  catalog_html = '''
115
  <!DOCTYPE html>
116
  <html lang="ru">
 
126
  }
127
  h1 {
128
  color: #333;
129
+ text-align: center;
130
  }
131
  .container {
132
  display: flex;
133
  flex-wrap: wrap;
134
+ justify-content: space-between;
135
+ gap: 20px;
 
 
 
136
  }
137
  .product {
138
+ flex: 1 1 calc(30% - 20px); /* Three columns */
139
  background-color: #fff;
140
  border: 1px solid #ddd;
141
  padding: 15px;
 
142
  border-radius: 5px;
143
+ text-align: center;
144
+ box-shadow: 0px 2px 5px rgba(0,0,0,0.1);
 
 
 
 
 
 
145
  }
146
  .product img {
147
+ max-width: 100%;
148
  height: auto;
149
+ border-radius: 5px;
 
150
  margin-bottom: 10px;
151
  }
 
152
  .pagination {
153
  text-align: center;
154
  margin-top: 20px;
 
160
  border: 1px solid #ddd;
161
  color: #333;
162
  background-color: white;
163
+ margin-right: 5px;
164
  }
165
  .pagination a.active {
166
  background-color: #4CAF50;
167
  color: white;
168
+ border-color: #4CAF50;
169
  }
170
  .pagination a:hover:not(.active) {
171
  background-color: #ddd;
 
174
  </head>
175
  <body>
176
  <h1>Каталог товаров</h1>
177
+
178
  <div class="container">
179
  {% for product in paginated_products %}
180
+ <div class="product">
181
+ <h2>{{ product['name'] }}</h2>
182
+ {% if product.get('photo') %}
 
 
 
 
183
  <img src="https://huggingface.co/datasets/{{ repo_id }}/resolve/main/photos/{{ product['photo'] }}" alt="{{ product['name'] }}">
 
 
 
 
 
184
  {% endif %}
185
+ <p><strong>Цена:</strong> {{ product['price'] }} руб.</p>
186
+ <p>{{ product['description'] }}</p>
187
+ </div>
188
  {% endfor %}
189
  </div>
190
+
191
+ <!-- Pagination -->
192
  <div class="pagination">
193
  {% if page > 1 %}
194
  <a href="{{ url_for('catalog', page=page-1) }}">Назад</a>
195
  {% endif %}
196
 
197
+ {% for p in range(1, total_pages + 1) %}
198
+ {% if p == page %}
199
+ <a class="active">{{ p }}</a>
200
  {% else %}
201
+ <a href="{{ url_for('catalog', page=p) }}">{{ p }}</a>
202
  {% endif %}
203
  {% endfor %}
204
+
205
  {% if page < total_pages %}
206
  <a href="{{ url_for('catalog', page=page+1) }}">Вперед</a>
207
  {% endif %}
208
  </div>
209
+
210
  </body>
211
  </html>
212
  '''
213
+
214
+ return render_template_string(catalog_html, paginated_products=paginated_products, repo_id=REPO_ID, page=page, total_pages=total_pages)
215
 
216
  @app.route('/admin', methods=['GET', 'POST'])
217
  def admin():
 
482
  return "База данных успешно скачана.", 200
483
 
484
  if __name__ == '__main__':
 
485
  backup_thread = threading.Thread(target=periodic_backup, daemon=True)
486
  backup_thread.start()
487
 
 
488
  try:
489
  load_data()
490
  except Exception as e:
491
+ logging.error(f"Не удалось загрузить базу данных при запуске приложения. Ошибка: {e}")
 
 
492
 
493
  app.run(debug=True, host='0.0.0.0', port=7860)