Initial commit

This commit is contained in:
Blake Ridgway 2025-07-05 15:29:33 -05:00
commit 315e731234
27 changed files with 3403 additions and 0 deletions

83
traffic_tracker.py Normal file
View file

@ -0,0 +1,83 @@
from flask import request, g, session
from datetime import datetime
import time
import hashlib
from models import db, PageView, UniqueVisitor
class TrafficTracker:
def __init__(self, app=None):
self.app = app
if app is not None:
self.init_app(app)
def init_app(self, app):
app.before_request(self.before_request)
app.after_request(self.after_request)
def before_request(self):
g.start_time = time.time()
if 'session_id' not in session:
session['session_id'] = hashlib.md5(
f"{request.remote_addr}{time.time()}".encode()
).hexdigest()
def after_request(self, response):
# Skip tracking for static files
if (request.endpoint and 'static' in request.endpoint):
return response
try:
self.track_page_view(response)
self.update_unique_visitor()
except Exception as e:
print(f"Traffic tracking error: {e}")
return response
def track_page_view(self, response):
response_time = (time.time() - g.start_time) * 1000
page_view = PageView(
ip_address=self.get_real_ip(),
user_agent=request.headers.get('User-Agent', ''),
path=request.path,
method=request.method,
referrer=request.headers.get('Referer', ''),
response_time=response_time,
status_code=response.status_code,
session_id=session.get('session_id')
)
db.session.add(page_view)
db.session.commit()
def update_unique_visitor(self):
ip = self.get_real_ip()
user_agent = request.headers.get('User-Agent', '')
user_agent_hash = hashlib.sha256(user_agent.encode()).hexdigest()
visitor = UniqueVisitor.query.filter_by(
ip_address=ip,
user_agent_hash=user_agent_hash
).first()
if visitor:
visitor.last_visit = datetime.utcnow()
visitor.visit_count += 1
else:
visitor = UniqueVisitor(
ip_address=ip,
user_agent_hash=user_agent_hash
)
db.session.add(visitor)
db.session.commit()
def get_real_ip(self):
if request.headers.get('X-Forwarded-For'):
return request.headers.get('X-Forwarded-For').split(',')[0].strip()
elif request.headers.get('X-Real-IP'):
return request.headers.get('X-Real-IP')
return request.remote_addr