Aleksmorshen commited on
Commit
2a32f00
·
verified ·
1 Parent(s): 9509b14

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +105 -26
app.py CHANGED
@@ -1,36 +1,115 @@
1
- from flask import Flask, request, redirect import json import os
 
 
2
 
3
- app = Flask(name) DB_FILE = 'data.json'
 
4
 
5
- def load_products(): # Создаём файл, если его нет if not os.path.exists(DB_FILE): with open(DB_FILE, 'w') as f: json.dump([], f)
 
 
 
 
 
 
6
 
7
- try:
8
- with open(DB_FILE, 'r') as f:
9
- return json.load(f)
10
- except json.JSONDecodeError:
11
- return [] # Если файл пустой или повреждён, возвращаем пустой список
12
- except Exception as e:
13
- print(f"Ошибка при загрузке данных: {e}")
14
- return []
 
 
15
 
16
- def save_products(products): try: with open(DB_FILE, 'w') as f: json.dump(products, f, indent=4, ensure_ascii=False) except Exception as e: print(f"Ошибка при сохранении данных: {e}")
 
 
 
 
 
 
17
 
18
- def html_wrapper(content): return f''' <!DOCTYPE html> <html> <head> <title>Каталог</title> <style> body {{ font-family: Arial, sans-serif; margin: 20px; }} .header {{ font-size: 24px; margin-bottom: 20px; }} .products {{ display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; }} .product {{ border: 1px solid #ddd; padding: 15px; border-radius: 5px; }} .product img {{ max-width: 200px; max-height: 200px; }} form {{ max-width: 500px; margin: 20px auto; }} input, textarea {{ width: 100%; margin: 5px 0; padding: 8px; }} button {{ background: #4CAF50; color: white; padding: 10px; border: none; cursor: pointer; }} nav {{ margin-bottom: 20px; }} a {{ margin-right: 15px; text-decoration: none; color: #333; }} </style> </head> <body> <nav> <a href="/">Каталог</a> <a href="/admin">Админка</a> </nav> {content} </body> </html> '''
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
 
20
- @app.route('/') def catalog(): products = load_products() products_html = ''.join([ f'''<div class="product"> <h3>{p['name']}</h3> <img src="{p['image']}" alt="{p['name']}"> <p>{p['description']}</p> <p>Цена: {p['price']} руб.</p> </div>''' for p in products ]) return html_wrapper(f''' <div class="header">Каталог товаров</div> <div class="products">{products_html}</div> ''')
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
 
22
- @app.route('/admin', methods=['GET', 'POST']) def admin(): if request.method == 'POST': products = load_products() products.append({ 'name': request.form['name'], 'description': request.form['description'], 'price': request.form['price'], 'image': request.form['image'] }) save_products(products) return redirect('/admin')
 
 
 
 
 
 
 
 
 
 
 
 
 
23
 
24
- return html_wrapper('''
25
- <div class="header">Админ-панель</div>
26
- <form method="POST">
27
- <input type="text" name="name" placeholder="Название" required>
28
- <textarea name="description" placeholder="Описание" required></textarea>
29
- <input type="number" name="price" placeholder="Цена" required>
30
- <input type="url" name="image" placeholder="URL изображения" required>
31
- <button type="submit">Добавить товар</button>
32
- </form>
33
  ''')
34
 
35
- if name == 'main': app.run(host='0.0.0.0', port=7860)
36
-
 
 
 
 
 
 
1
+ from flask import Flask, request, redirect
2
+ import json
3
+ import os
4
 
5
+ app = Flask(__name__)
6
+ DB_FILE = 'data.json'
7
 
8
+ # Функция для создания нового JSON-файла
9
+ def initialize_db():
10
+ try:
11
+ with open(DB_FILE, 'w') as f:
12
+ json.dump([], f) # Создаём пустой массив в файле
13
+ except Exception as e:
14
+ print(f"Ошибка при создании файла {DB_FILE}: {e}")
15
 
16
+ # Функция для загрузки данных из файла
17
+ def load_products():
18
+ if not os.path.exists(DB_FILE): # Если файл не существует, создаём его
19
+ initialize_db()
20
+ try:
21
+ with open(DB_FILE, 'r') as f:
22
+ return json.load(f)
23
+ except (json.JSONDecodeError, Exception) as e:
24
+ print(f"Ошибка при чтении файла {DB_FILE}: {e}")
25
+ return []
26
 
27
+ # Функция для сохранения данных в файл
28
+ def save_products(products):
29
+ try:
30
+ with open(DB_FILE, 'w') as f:
31
+ json.dump(products, f)
32
+ except Exception as e:
33
+ print(f"Ошибка при записи в файл {DB_FILE}: {e}")
34
 
35
+ # Вспомогательная функция для обёртки HTML-контента
36
+ def html_wrapper(content):
37
+ return f'''
38
+ <!DOCTYPE html>
39
+ <html>
40
+ <head>
41
+ <title>Каталог</title>
42
+ <style>
43
+ body {{ font-family: Arial, sans-serif; margin: 20px; }}
44
+ .header {{ font-size: 24px; margin-bottom: 20px; }}
45
+ .products {{ display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; }}
46
+ .product {{ border: 1px solid #ddd; padding: 15px; border-radius: 5px; }}
47
+ .product img {{ max-width: 200px; max-height: 200px; }}
48
+ form {{ max-width: 500px; margin: 20px auto; }}
49
+ input, textarea {{ width: 100%; margin: 5px 0; padding: 8px; }}
50
+ button {{ background: #4CAF50; color: white; padding: 10px; border: none; cursor: pointer; }}
51
+ nav {{ margin-bottom: 20px; }}
52
+ a {{ margin-right: 15px; text-decoration: none; color: #333; }}
53
+ </style>
54
+ </head>
55
+ <body>
56
+ <nav>
57
+ <a href="/">Каталог</a>
58
+ <a href="/admin">Админка</a>
59
+ </nav>
60
+ {content}
61
+ </body>
62
+ </html>
63
+ '''
64
 
65
+ # Маршрут для отображения каталога товаров
66
+ @app.route('/')
67
+ def catalog():
68
+ products = load_products()
69
+ products_html = ''.join([
70
+ f'''<div class="product">
71
+ <h3>{p['name']}</h3>
72
+ <img src="{p['image']}">
73
+ <p>{p['description']}</p>
74
+ <p>Цена: {p['price']} руб.</p>
75
+ </div>'''
76
+ for p in products
77
+ ])
78
+ return html_wrapper(f'''
79
+ <div class="header">Каталог товаров</div>
80
+ <div class="products">{products_html}</div>
81
+ ''')
82
 
83
+ # Маршрут для админ-панели (добавление товаров)
84
+ @app.route('/admin', methods=['GET', 'POST'])
85
+ def admin():
86
+ if request.method == 'POST':
87
+ products = load_products()
88
+ # Добавляем новый товар из формы
89
+ products.append({
90
+ 'name': request.form['name'],
91
+ 'description': request.form['description'],
92
+ 'price': request.form['price'],
93
+ 'image': request.form['image']
94
+ })
95
+ save_products(products)
96
+ return redirect('/admin')
97
 
98
+ return html_wrapper('''
99
+ <div class="header">Админ-панель</div>
100
+ <form method="POST">
101
+ <input type="text" name="name" placeholder="Название" required>
102
+ <textarea name="description" placeholder="Описание" required></textarea>
103
+ <input type="number" name="price" placeholder="Цена" required>
104
+ <input type="url" name="image" placeholder="URL изображения" required>
105
+ <button type="submit">Добавить товар</button>
106
+ </form>
107
  ''')
108
 
109
+ # Точка входа в приложение
110
+ if __name__ == '__main__':
111
+ # Проверяем наличие файла при запуске и создаём его при необходимости
112
+ if not os.path.exists(DB_FILE):
113
+ initialize_db()
114
+
115
+ app.run(host='0.0.0.0', port=7860)