Browse Source

saving and loading page traffic data

Rodja Trappe 2 years ago
parent
commit
557118038c
3 changed files with 45 additions and 13 deletions
  1. 1 0
      .gitignore
  2. 2 2
      main.py
  3. 42 11
      traffic_tracking.py

+ 1 - 0
.gitignore

@@ -3,3 +3,4 @@ __pycache__/
 .*.swp
 dist
 /test.py
+*.pickle

+ 2 - 2
main.py

@@ -110,8 +110,8 @@ with ui.row().classes('flex w-full'):
                 with ui.column().classes('w-24'):
                     ui.label('Output:')
                     output = ui.label('').classes('text-bold')
-        with ui.card():
-            traffic_tracking.add().style(f'width:{width}px;height:250px')
+        with ui.row().style('margin-top: 40px'):
+            traffic_tracking.add_chart().style(f'width:{width}px;height:250px')
 
 ui.markdown('## API Documentation and Examples')
 

+ 42 - 11
traffic_tracking.py

@@ -1,30 +1,33 @@
+import logging
 import os
+import pickle
+import threading
 import time
 
 from starlette.requests import Request
 
 from nicegui import ui
 
+page_visits: dict[int, int] = {}
+page_sessions: dict[int, set[str]] = {}
 
-def add() -> ui.chart:
-    page_visits: dict[int, int] = {}
-    page_sessions: dict[int, set[str]] = {}
 
-    def handle_connection(request: Request):
+def add_chart() -> ui.chart:
+
+    def on_connect(request: Request):
         factor = 60 * 24
         today = int(time.time() / factor)
         page_visits[today] = page_visits.get(today, 0) + 1
-        traffic_chart.options.series[0].data[:] = [[day * factor * 1000, count]
-                                                   for day, count in page_visits.items()]
+        traffic_chart.options.series[0].data[:] = [[day * factor * 1000, count] for day, count in page_visits.items()]
         if not today in page_sessions:
             page_sessions[today] = set()
         page_sessions[today].add(request.session_id)
-        traffic_chart.options.series[1].data[:] = [
-            [day * factor * 1000, len(s)] for day, s in page_sessions.items()]
+        traffic_chart.options.series[1].data[:] = [[day * factor * 1000, len(s)] for day, s in page_sessions.items()]
         traffic_chart.update()
 
-    ui.on_connect(handle_connection)
-
+    ui.on_connect(on_connect)
+    ui.timer(10, save)
+    load()
     traffic_chart = ui.chart({
         'title': {'text': 'Traffic'},
         'navigation': {'buttonOptions': {'enabled': False}},
@@ -40,5 +43,33 @@ def add() -> ui.chart:
         ],
     })
 
-    traffic_chart.visible = os.environ.get('SHOW_TRAFFIC')
+    traffic_chart.visible = os.environ.get('SHOW_TRAFFIC_CHART', False)
     return traffic_chart
+
+
+def load():
+    global page_visits, page_sessions
+    try:
+        with open('page_visits.pickle', 'rb') as f:
+            page_visits = pickle.load(f)
+        with open('page_sessions.pickle', 'rb') as f:
+            page_sessions = pickle.load(f)
+    except FileNotFoundError:
+        pass
+    except:
+        logging.exception("Error loading traffic data")
+
+
+def save():
+    def _save():
+        try:
+            print(f'saving {page_visits} and {page_sessions}')
+            with open('page_visits.pickle', 'wb') as f:
+                pickle.dump(page_visits, f)
+            with open('page_sessions.pickle', 'wb') as f:
+                pickle.dump(page_sessions, f)
+        except:
+            logging.exception("Error saving traffic data")
+
+    t = threading.Thread(target=_save, name="Save Traffic Data")
+    t.start()