DmitrMakeev commited on
Commit
d9f70cd
·
verified ·
1 Parent(s): 6a82b1a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +37 -20
app.py CHANGED
@@ -327,21 +327,17 @@ def plot_ph_week():
327
  # Получаем номер недели из параметра (по умолчанию 1)
328
  week_number = request.args.get('week', default=1, type=int)
329
 
330
- # Проверяем границы (1-30 недель)
331
- if week_number < 1:
332
- week_number = 1
333
- elif week_number > 30:
334
- week_number = 30
335
 
336
  # Подключаемся к базе данных
337
  conn = sqlite3.connect('system_data.db')
338
  cursor = conn.cursor()
339
 
340
- # Проверяем, существует ли таблица
341
  cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='system_data'")
342
- table_exists = cursor.fetchone()
343
-
344
- if not table_exists:
345
  return '''
346
  <html>
347
  <body>
@@ -352,7 +348,7 @@ def plot_ph_week():
352
  </html>
353
  '''
354
 
355
- # Выбираем все данные за указанную неделю
356
  cursor.execute('''
357
  SELECT dey, ph
358
  FROM system_data
@@ -363,7 +359,7 @@ def plot_ph_week():
363
 
364
  conn.close()
365
 
366
- # Если данных нет, вывести сообщение и оставить кнопки
367
  if not rows:
368
  return f'''
369
  <html>
@@ -379,30 +375,42 @@ def plot_ph_week():
379
  # Создаём словарь {день недели: список значений pH}
380
  data_by_day = {i: [] for i in range(1, 8)}
381
  for day, ph in rows:
382
- data_by_day[day].append(float(ph))
 
 
 
 
 
383
 
384
- # Создаём график (X: дни 1-7, Y: pH)
385
- plt.figure(figsize=(10, 5))
386
 
387
- # Наносим точки для каждого дня
 
388
  for day in range(1, 8):
389
- plt.scatter([day] * len(data_by_day[day]), data_by_day[day], label=f'День {day}')
 
390
 
391
  plt.title(f'Значения pH за {week_number}-ю неделю')
392
  plt.xlabel('День недели')
393
  plt.ylabel('Значение pH')
394
- plt.xticks(range(1, 8)) # Подписи оси X (1-7)
395
  plt.grid(True)
 
396
 
397
  # Сохраняем график в буфер
398
  buffer = io.BytesIO()
399
  plt.savefig(buffer, format='png')
400
  buffer.seek(0)
401
 
402
- # Кодируем график в base64
403
  plot_data = base64.b64encode(buffer.getvalue()).decode('utf-8')
404
 
405
- # Возвращаем HTML с кнопками управления
 
 
 
 
406
  return f'''
407
  <html>
408
  <body>
@@ -416,7 +424,16 @@ def plot_ph_week():
416
  '''
417
 
418
  except Exception as e:
419
- return jsonify({'status': 'error', 'message': str(e)}), 500
 
 
 
 
 
 
 
 
 
420
 
421
 
422
 
 
327
  # Получаем номер недели из параметра (по умолчанию 1)
328
  week_number = request.args.get('week', default=1, type=int)
329
 
330
+ # Ограничиваем границы (1-30 недель)
331
+ week_number = max(1, min(30, week_number))
 
 
 
332
 
333
  # Подключаемся к базе данных
334
  conn = sqlite3.connect('system_data.db')
335
  cursor = conn.cursor()
336
 
337
+ # Проверяем существование таблицы
338
  cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='system_data'")
339
+ if not cursor.fetchone():
340
+ conn.close()
 
341
  return '''
342
  <html>
343
  <body>
 
348
  </html>
349
  '''
350
 
351
+ # Выборка данных за указанную неделю
352
  cursor.execute('''
353
  SELECT dey, ph
354
  FROM system_data
 
359
 
360
  conn.close()
361
 
362
+ # Если данных нет
363
  if not rows:
364
  return f'''
365
  <html>
 
375
  # Создаём словарь {день недели: список значений pH}
376
  data_by_day = {i: [] for i in range(1, 8)}
377
  for day, ph in rows:
378
+ # Преобразуем ph в float, если оно строка
379
+ try:
380
+ ph_value = float(ph)
381
+ data_by_day[day].append(ph_value)
382
+ except (ValueError, TypeError):
383
+ continue # Пропускаем некорректные значения
384
 
385
+ # Очищаем предыдущий график
386
+ plt.clf()
387
 
388
+ # Создаём график
389
+ plt.figure(figsize=(10, 5))
390
  for day in range(1, 8):
391
+ if data_by_day[day]: # Проверяем, есть ли данные
392
+ plt.scatter([day] * len(data_by_day[day]), data_by_day[day], label=f'День {day}')
393
 
394
  plt.title(f'Значения pH за {week_number}-ю неделю')
395
  plt.xlabel('День недели')
396
  plt.ylabel('Значение pH')
397
+ plt.xticks(range(1, 8))
398
  plt.grid(True)
399
+ plt.legend() # Добавляем легенду для ясности
400
 
401
  # Сохраняем график в буфер
402
  buffer = io.BytesIO()
403
  plt.savefig(buffer, format='png')
404
  buffer.seek(0)
405
 
406
+ # Кодируем в base64
407
  plot_data = base64.b64encode(buffer.getvalue()).decode('utf-8')
408
 
409
+ # Закрываем буфер и очищаем график
410
+ buffer.close()
411
+ plt.close() # Закрываем фигуру, чтобы избежать утечек памяти
412
+
413
+ # Возвращаем HTML
414
  return f'''
415
  <html>
416
  <body>
 
424
  '''
425
 
426
  except Exception as e:
427
+ # Возвращаем HTML вместо JSON для консистентности
428
+ return f'''
429
+ <html>
430
+ <body>
431
+ <h1>Ошибка!</h1>
432
+ <p>Произошла ошибка: {str(e)}</p>
433
+ <button onclick="window.location.href='/plot_ph_week'">Назад</button>
434
+ </body>
435
+ </html>
436
+ ''', 500
437
 
438
 
439