perf(webapp): voeg caching toe voor verbeterde API-prestaties

Caching is geïmplementeerd voor API-aanroepen om de prestaties van de webapplicatie te optimaliseren. Een lru_cache decorator en een aangepaste cache-functionaliteit zijn toegevoegd voor het laden van instellingen en het ophalen van weers- en Sonos-zonegegevens. Deze wijzigingen verminderen de belasting van externe bronnen en verbeteren de reactiesnelheid van de applicatie door herhaalde aanroepen binnen een korte tijdsduur te vermijden.
This commit is contained in:
filoor 2025-05-29 21:25:10 +02:00
parent c4ffa6e9aa
commit 61ef428fad
2 changed files with 39 additions and 10 deletions

View File

@ -1,11 +1,31 @@
from flask import Flask, render_template, request, redirect, send_from_directory, jsonify, request as flask_request from flask import Flask, render_template, request, redirect, send_from_directory, jsonify, request as flask_request
import requests, json, os, random, subprocess import requests, json, os, random, subprocess
from datetime import datetime from datetime import datetime, timedelta
from config import * from config import *
from hijridate import Gregorian from hijridate import Gregorian
from functools import lru_cache
import time
app = Flask(__name__) app = Flask(__name__)
# Cache configuratie
CACHE_DURATION = 300 # 5 minuten cache voor API calls
last_api_call = {}
cached_data = {}
def get_cached_data(key, fetch_func, duration=CACHE_DURATION):
"""Haal data uit cache of voer fetch_func uit als cache verlopen is"""
current_time = time.time()
if key in cached_data and key in last_api_call:
if current_time - last_api_call[key] < duration:
return cached_data[key]
data = fetch_func()
cached_data[key] = data
last_api_call[key] = current_time
return data
# Voeg cache-control headers toe voor statische bestanden # Voeg cache-control headers toe voor statische bestanden
@app.after_request @app.after_request
def add_header(response): def add_header(response):
@ -28,8 +48,21 @@ CLIPS_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'static',
debug_time_offset = 0 # Offset in seconden voor debug mode debug_time_offset = 0 # Offset in seconden voor debug mode
debug_mode_active = False debug_mode_active = False
@lru_cache(maxsize=1)
def load_settings():
try:
if os.path.exists(SETTINGS_PATH) and os.path.getsize(SETTINGS_PATH) > 0:
with open(SETTINGS_PATH) as f:
return json.load(f)
except Exception as e:
print(f"⚠️ Fout bij laden van settings: {e}")
return {"volume": 30, "zones": ["Woonkamer"], "audio_clip": "adhan1.mp3"}
def fetch_weather_data(): def fetch_weather_data():
"""Haalt weersinformatie op voor de geconfigureerde locatie""" """Haalt weersinformatie op voor de geconfigureerde locatie"""
return get_cached_data('weather', lambda: _fetch_weather_data_impl())
def _fetch_weather_data_impl():
try: try:
params = { params = {
'q': WEATHER_LOCATION, 'q': WEATHER_LOCATION,
@ -70,15 +103,6 @@ def load_hadith():
print(f"⚠️ Fout bij laden van hadith: {e}") print(f"⚠️ Fout bij laden van hadith: {e}")
return {"text": "De daden die Allah het meest liefheeft zijn degenen die regelmatig worden verricht, zelfs als ze klein zijn.", "bron": "Sahih al-Bukhari"} return {"text": "De daden die Allah het meest liefheeft zijn degenen die regelmatig worden verricht, zelfs als ze klein zijn.", "bron": "Sahih al-Bukhari"}
def load_settings():
try:
if os.path.exists(SETTINGS_PATH) and os.path.getsize(SETTINGS_PATH) > 0:
with open(SETTINGS_PATH) as f:
return json.load(f)
except Exception as e:
print(f"⚠️ Fout bij laden van settings: {e}")
return {"volume": 30, "zones": ["Woonkamer"], "audio_clip": "adhan1.mp3"}
def get_current_volume(settings): def get_current_volume(settings):
"""Bepaal het juiste volume op basis van de huidige tijd""" """Bepaal het juiste volume op basis van de huidige tijd"""
from datetime import datetime, timedelta from datetime import datetime, timedelta
@ -158,7 +182,11 @@ def apply_prayer_offsets(gebedstijden, settings):
return adjusted_times return adjusted_times
@lru_cache(maxsize=1)
def fetch_sonos_zones(): def fetch_sonos_zones():
return get_cached_data('sonos_zones', lambda: _fetch_sonos_zones_impl())
def _fetch_sonos_zones_impl():
try: try:
res = requests.get(f'http://{SONOS_API_IP}:5005/zones', timeout=5) res = requests.get(f'http://{SONOS_API_IP}:5005/zones', timeout=5)
res.raise_for_status() res.raise_for_status()

View File

@ -13,3 +13,4 @@ Mon May 26 18:17:57 CEST 2025: Tijdzone probleem opgelost - Container gebruikt n
2025-05-28 03:49:24 - Adzkaar fullscreen functionaliteit geïmplementeerd: nieuwe /adzkaar route, instellingen, debug knoppen, automatische trigger na gebedstijden, Nederlandse/Arabische dhikr content 2025-05-28 03:49:24 - Adzkaar fullscreen functionaliteit geïmplementeerd: nieuwe /adzkaar route, instellingen, debug knoppen, automatische trigger na gebedstijden, Nederlandse/Arabische dhikr content
2025-05-28 03:55:38 - Adzkaar scherm verbeterd naar kaart-voor-kaart weergave met navigatie knoppen en toetsenbord besturing 2025-05-28 03:55:38 - Adzkaar scherm verbeterd naar kaart-voor-kaart weergave met navigatie knoppen en toetsenbord besturing
Wed May 28 14:09:12 CEST 2025: Sonos debug tijd synchronisatie geïmplementeerd - get_current_volume functie en cron script gebruiken nu debug tijd API, volume bepaling werkt correct in debug mode Wed May 28 14:09:12 CEST 2025: Sonos debug tijd synchronisatie geïmplementeerd - get_current_volume functie en cron script gebruiken nu debug tijd API, volume bepaling werkt correct in debug mode
2025-05-29 21:24:37 - Performance optimalisaties toegevoegd: caching voor API calls en instellingen