traffic_tracking.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import logging
  2. import os
  3. import pickle
  4. import threading
  5. import time
  6. from typing import Dict, Set
  7. from starlette.requests import Request
  8. from nicegui import ui
  9. page_visits: Dict[int, int] = {}
  10. page_sessions: Dict[int, Set[str]] = {}
  11. def add_chart() -> ui.chart:
  12. def on_connect(request: Request):
  13. factor = 60 * 24
  14. today = int(time.time() / factor)
  15. page_visits[today] = page_visits.get(today, 0) + 1
  16. traffic_chart.options.series[0].data[:] = [[day * factor * 1000, count] for day, count in page_visits.items()]
  17. if not today in page_sessions:
  18. page_sessions[today] = set()
  19. page_sessions[today].add(request.session_id)
  20. traffic_chart.options.series[1].data[:] = [[day * factor * 1000, len(s)] for day, s in page_sessions.items()]
  21. traffic_chart.update()
  22. ui.on_connect(on_connect)
  23. ui.timer(10, save)
  24. load()
  25. traffic_chart = ui.chart({
  26. 'title': {'text': 'Traffic'},
  27. 'navigation': {'buttonOptions': {'enabled': False}},
  28. 'chart': {'type': 'line'},
  29. 'yAxis': {'title': False},
  30. 'xAxis': {
  31. 'type': 'datetime',
  32. 'labels': {'format': '{value:%e. %b}', },
  33. },
  34. 'series': [
  35. {'name': 'Views', 'data': []},
  36. {'name': 'Sessions', 'data': []},
  37. ],
  38. })
  39. traffic_chart.visible = os.environ.get('SHOW_TRAFFIC_CHART', False)
  40. return traffic_chart
  41. def load() -> None:
  42. global page_visits, page_sessions
  43. try:
  44. with open('page_visits.pickle', 'rb') as f:
  45. page_visits = pickle.load(f)
  46. with open('page_sessions.pickle', 'rb') as f:
  47. page_sessions = pickle.load(f)
  48. except FileNotFoundError:
  49. pass
  50. except:
  51. logging.exception("Error loading traffic data")
  52. def save() -> None:
  53. def _save():
  54. try:
  55. with open('page_visits.pickle', 'wb') as f:
  56. pickle.dump(page_visits, f)
  57. with open('page_sessions.pickle', 'wb') as f:
  58. pickle.dump(page_sessions, f)
  59. except:
  60. logging.exception("Error saving traffic data")
  61. t = threading.Thread(target=_save, name="Save Traffic Data")
  62. t.start()