modified: app.py
This commit is contained in:
107
app.py
107
app.py
@@ -85,78 +85,15 @@ def stop_bot():
|
|||||||
else:
|
else:
|
||||||
print("Bot läuft nicht.")
|
print("Bot läuft nicht.")
|
||||||
|
|
||||||
def test_db_connection():
|
|
||||||
"""Testet die Datenbankverbindung."""
|
|
||||||
try:
|
|
||||||
connection = get_db_connection()
|
|
||||||
if connection.is_connected():
|
|
||||||
print("Datenbankverbindung erfolgreich!")
|
|
||||||
connection.close()
|
|
||||||
return True
|
|
||||||
except Exception as err:
|
|
||||||
print(f"Datenbankverbindungstest fehlgeschlagen: {err}")
|
|
||||||
return False
|
|
||||||
return False
|
|
||||||
|
|
||||||
def safe_db_operation(operation_func, *args, **kwargs):
|
|
||||||
"""Führt eine Datenbankoperation sicher aus mit Fehlerbehandlung."""
|
|
||||||
try:
|
|
||||||
connection = get_db_connection()
|
|
||||||
cursor = connection.cursor(dictionary=True)
|
|
||||||
|
|
||||||
result = operation_func(cursor, *args, **kwargs)
|
|
||||||
|
|
||||||
cursor.close()
|
|
||||||
connection.close()
|
|
||||||
|
|
||||||
return result
|
|
||||||
except mysql.connector.Error as err:
|
|
||||||
print(f"Datenbankfehler: {err}")
|
|
||||||
return None
|
|
||||||
except Exception as err:
|
|
||||||
print(f"Unerwarteter Fehler bei Datenbankoperation: {err}")
|
|
||||||
return None
|
|
||||||
|
|
||||||
def get_db_connection():
|
def get_db_connection():
|
||||||
"""Stellt eine Verbindung zur MySQL-Datenbank her mit Retry-Mechanismus."""
|
"""Stellt eine Verbindung zur MySQL-Datenbank her."""
|
||||||
import time
|
return mysql.connector.connect(
|
||||||
max_retries = 3
|
|
||||||
retry_delay = 1 # Sekunden
|
|
||||||
|
|
||||||
for attempt in range(max_retries):
|
|
||||||
try:
|
|
||||||
connection = mysql.connector.connect(
|
|
||||||
host=DB_HOST,
|
host=DB_HOST,
|
||||||
port=DB_PORT,
|
port=DB_PORT,
|
||||||
user=DB_USER,
|
user=DB_USER,
|
||||||
password=DB_PASS,
|
password=DB_PASS,
|
||||||
database=DB_NAME,
|
database=DB_NAME
|
||||||
autocommit=True,
|
|
||||||
connection_timeout=10,
|
|
||||||
reconnect=True,
|
|
||||||
charset='utf8mb4',
|
|
||||||
collation='utf8mb4_unicode_ci'
|
|
||||||
)
|
)
|
||||||
# Test the connection
|
|
||||||
if connection.is_connected():
|
|
||||||
return connection
|
|
||||||
except mysql.connector.Error as err:
|
|
||||||
print(f"Datenbankverbindung Versuch {attempt + 1} fehlgeschlagen: {err}")
|
|
||||||
if attempt < max_retries - 1:
|
|
||||||
time.sleep(retry_delay)
|
|
||||||
retry_delay *= 2 # Exponential backoff
|
|
||||||
else:
|
|
||||||
print("Alle Datenbankverbindungsversuche fehlgeschlagen")
|
|
||||||
raise
|
|
||||||
except Exception as err:
|
|
||||||
print(f"Unerwarteter Fehler bei Datenbankverbindung: {err}")
|
|
||||||
if attempt < max_retries - 1:
|
|
||||||
time.sleep(retry_delay)
|
|
||||||
retry_delay *= 2
|
|
||||||
else:
|
|
||||||
raise
|
|
||||||
|
|
||||||
raise mysql.connector.Error("Konnte keine Datenbankverbindung herstellen")
|
|
||||||
|
|
||||||
def token_updater(token):
|
def token_updater(token):
|
||||||
session['oauth_token'] = token
|
session['oauth_token'] = token
|
||||||
@@ -280,7 +217,6 @@ def load_user_data():
|
|||||||
g.bot_running = bot_status() # Lädt den Bot-Status in g
|
g.bot_running = bot_status() # Lädt den Bot-Status in g
|
||||||
|
|
||||||
# Hole die Liste der Gilden aus der Datenbank
|
# Hole die Liste der Gilden aus der Datenbank
|
||||||
try:
|
|
||||||
connection = get_db_connection()
|
connection = get_db_connection()
|
||||||
cursor = connection.cursor(dictionary=True)
|
cursor = connection.cursor(dictionary=True)
|
||||||
|
|
||||||
@@ -288,25 +224,15 @@ def load_user_data():
|
|||||||
user_guilds = session.get("discord_guilds", [])
|
user_guilds = session.get("discord_guilds", [])
|
||||||
user_guild_ids = [guild["id"] for guild in user_guilds]
|
user_guild_ids = [guild["id"] for guild in user_guilds]
|
||||||
|
|
||||||
if user_guild_ids:
|
|
||||||
# Finde nur die Gilden, die auch in der Datenbank existieren
|
# Finde nur die Gilden, die auch in der Datenbank existieren
|
||||||
cursor.execute("SELECT guild_id FROM guilds WHERE guild_id IN (%s)" % ','.join(['%s'] * len(user_guild_ids)), user_guild_ids)
|
cursor.execute("SELECT guild_id FROM guilds WHERE guild_id IN (%s)" % ','.join(['%s'] * len(user_guild_ids)), user_guild_ids)
|
||||||
existing_guilds = cursor.fetchall()
|
existing_guilds = cursor.fetchall()
|
||||||
|
|
||||||
# Filtere die Gilden des Nutzers basierend auf der Existenz in der Datenbank
|
# Filtere die Gilden des Nutzers basierend auf der Existenz in der Datenbank
|
||||||
g.guilds = [guild for guild in user_guilds if int(guild["id"]) in {g["guild_id"] for g in existing_guilds}]
|
g.guilds = [guild for guild in user_guilds if int(guild["id"]) in {g["guild_id"] for g in existing_guilds}]
|
||||||
else:
|
|
||||||
g.guilds = []
|
|
||||||
|
|
||||||
cursor.close()
|
cursor.close()
|
||||||
connection.close()
|
connection.close()
|
||||||
|
|
||||||
except mysql.connector.Error as err:
|
|
||||||
print(f"Datenbankfehler in load_user_data: {err}")
|
|
||||||
g.guilds = [] # Fallback auf leere Liste
|
|
||||||
except Exception as err:
|
|
||||||
print(f"Unerwarteter Fehler in load_user_data: {err}")
|
|
||||||
g.guilds = [] # Fallback auf leere Liste
|
|
||||||
else:
|
else:
|
||||||
# Falls der Benutzer nicht eingeloggt ist, keine Daten setzen
|
# Falls der Benutzer nicht eingeloggt ist, keine Daten setzen
|
||||||
g.user_info = None
|
g.user_info = None
|
||||||
@@ -881,38 +807,11 @@ def stop():
|
|||||||
return redirect(url_for("global_admin_dashboard"))
|
return redirect(url_for("global_admin_dashboard"))
|
||||||
return redirect(url_for("landing_page"))
|
return redirect(url_for("landing_page"))
|
||||||
|
|
||||||
@app.route("/health")
|
|
||||||
def health_check():
|
|
||||||
"""Health-Check-Endpunkt für die Anwendung und Datenbank."""
|
|
||||||
health_status = {
|
|
||||||
"status": "healthy",
|
|
||||||
"timestamp": datetime.now().isoformat(),
|
|
||||||
"database": "disconnected",
|
|
||||||
"version": __version__
|
|
||||||
}
|
|
||||||
|
|
||||||
# Teste die Datenbankverbindung
|
|
||||||
if test_db_connection():
|
|
||||||
health_status["database"] = "connected"
|
|
||||||
return jsonify(health_status), 200
|
|
||||||
else:
|
|
||||||
health_status["status"] = "unhealthy"
|
|
||||||
health_status["database"] = "error"
|
|
||||||
return jsonify(health_status), 503
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
# Disable default Flask logging for static files
|
# Disable default Flask logging for static files
|
||||||
app.logger.disabled = True
|
app.logger.disabled = True
|
||||||
log = logging.getLogger('werkzeug')
|
log = logging.getLogger('werkzeug')
|
||||||
log.disabled = True
|
log.disabled = True
|
||||||
|
|
||||||
# Test database connection on startup
|
|
||||||
print("Teste Datenbankverbindung beim Start...")
|
|
||||||
if test_db_connection():
|
|
||||||
print("✅ Datenbankverbindung erfolgreich!")
|
|
||||||
else:
|
|
||||||
print("❌ Datenbankverbindung fehlgeschlagen! Überprüfe die Konfiguration.")
|
|
||||||
print("Die Anwendung wird trotzdem gestartet, aber Datenbankfunktionen sind nicht verfügbar.")
|
|
||||||
|
|
||||||
# Start app with minimal logging
|
# Start app with minimal logging
|
||||||
app.run(host="0.0.0.0", port=5000, debug=True)
|
app.run(host="0.0.0.0", port=5000, debug=True)
|
||||||
|
|||||||
Reference in New Issue
Block a user