diff --git a/__pycache__/app.cpython-313.pyc b/__pycache__/app.cpython-313.pyc index c7f01c4..a39f09a 100644 Binary files a/__pycache__/app.cpython-313.pyc and b/__pycache__/app.cpython-313.pyc differ diff --git a/app.py b/app.py index 9174fb7..34940a5 100644 --- a/app.py +++ b/app.py @@ -5,6 +5,7 @@ import os import logging import traceback from datetime import datetime, timedelta, timezone +from functools import wraps from flask import Flask, render_template, request, redirect, url_for, flash, jsonify, session, g from flask_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user from flask_sqlalchemy import SQLAlchemy @@ -1710,20 +1711,78 @@ def get_dark_mode(): # Fehlerhandler @app.errorhandler(404) def page_not_found(e): + """404 Fehler - Seite nicht gefunden""" + ErrorHandler.log_exception(e, code=404) + is_api_request = request.path.startswith('/api/') + + if is_api_request: + return ErrorHandler.api_error("Die angeforderte Ressource wurde nicht gefunden.", 404) return render_template('errors/404.html'), 404 @app.errorhandler(403) def forbidden(e): + """403 Fehler - Zugriff verweigert""" + ErrorHandler.log_exception(e, code=403) + is_api_request = request.path.startswith('/api/') + + if is_api_request: + return ErrorHandler.api_error("Sie haben keine Berechtigung, auf diese Ressource zuzugreifen.", 403) return render_template('errors/403.html'), 403 @app.errorhandler(500) def internal_server_error(e): + """500 Fehler - Interner Serverfehler""" + ErrorHandler.log_exception(e, code=500) + is_api_request = request.path.startswith('/api/') + + if is_api_request: + return ErrorHandler.api_error("Ein interner Serverfehler ist aufgetreten.", 500) return render_template('errors/500.html'), 500 @app.errorhandler(429) def too_many_requests(e): + """429 Fehler - Zu viele Anfragen""" + ErrorHandler.log_exception(e, code=429) + is_api_request = request.path.startswith('/api/') + + if is_api_request: + return ErrorHandler.api_error("Zu viele Anfragen. Bitte versuchen Sie es später erneut.", 429) return render_template('errors/429.html'), 429 +@app.errorhandler(400) +def bad_request(e): + """400 Fehler - Ungültige Anfrage""" + ErrorHandler.log_exception(e, code=400) + is_api_request = request.path.startswith('/api/') + + if is_api_request: + return ErrorHandler.api_error("Die Anfrage konnte nicht verarbeitet werden.", 400) + flash("Die Anfrage konnte nicht verarbeitet werden. Bitte überprüfen Sie Ihre Eingaben.", "error") + return render_template('errors/400.html', error=str(e)), 400 + +@app.errorhandler(401) +def unauthorized(e): + """401 Fehler - Nicht autorisiert""" + ErrorHandler.log_exception(e, code=401) + is_api_request = request.path.startswith('/api/') + + if is_api_request: + return ErrorHandler.api_error("Authentifizierung erforderlich.", 401) + flash("Sie müssen sich anmelden, um auf diese Seite zuzugreifen.", "error") + return redirect(url_for('login')) + +# Hilfsfunktion zur Fehlerbehandlung in API-Endpunkten +def handle_api_exception(func): + """Decorator für API-Endpunkte zur einheitlichen Fehlerbehandlung""" + @wraps(func) + def wrapper(*args, **kwargs): + try: + return func(*args, **kwargs) + except Exception as e: + # Log und API-Fehler zurückgeben + return ErrorHandler.handle_exception(e, is_api_request=True) + return wrapper + # OpenAI-Integration für KI-Assistenz @app.route('/api/assistant', methods=['POST']) def chat_with_assistant(): @@ -2383,6 +2442,7 @@ def get_public_mindmap_nodes(): # Suchfunktion für Mindmap-Knoten @app.route('/api/search/mindmap', methods=['GET']) +@handle_api_exception def search_mindmap_nodes(): """ Durchsucht Mindmap-Knoten nach einem Suchbegriff. @@ -2489,6 +2549,7 @@ def search_mindmap_nodes(): # Export/Import-Funktionen für Mindmaps @app.route('/api/mindmap//export', methods=['GET']) @login_required +@handle_api_exception def export_mindmap(mindmap_id): """ Exportiert eine Mindmap im angegebenen Format. @@ -2620,6 +2681,7 @@ def export_mindmap(mindmap_id): @app.route('/api/mindmap//import', methods=['POST']) @login_required +@handle_api_exception def import_mindmap(mindmap_id): """ Importiert Daten in eine bestehende Mindmap. diff --git a/logs/app.log b/logs/app.log new file mode 100644 index 0000000..49be42e --- /dev/null +++ b/logs/app.log @@ -0,0 +1,15 @@ +2025-05-10 23:12:44,110 INFO: Anwendung gestartet [in C:\Users\TTOMCZA.EMEA\Dev\website\app.py:74] +2025-05-10 23:12:45,854 INFO: Anwendung gestartet [in C:\Users\TTOMCZA.EMEA\Dev\website\app.py:74] +2025-05-10 23:12:45,854 INFO: Anwendung gestartet [in C:\Users\TTOMCZA.EMEA\Dev\website\app.py:74] +2025-05-10 23:13:27,379 INFO: Anwendung gestartet [in C:\Users\TTOMCZA.EMEA\Dev\website\app.py:74] +2025-05-10 23:13:29,289 INFO: Anwendung gestartet [in C:\Users\TTOMCZA.EMEA\Dev\website\app.py:74] +2025-05-10 23:13:29,289 INFO: Anwendung gestartet [in C:\Users\TTOMCZA.EMEA\Dev\website\app.py:74] +2025-05-10 23:13:35,686 INFO: Anwendung gestartet [in C:\Users\TTOMCZA.EMEA\Dev\website\app.py:75] +2025-05-10 23:13:37,640 INFO: Anwendung gestartet [in C:\Users\TTOMCZA.EMEA\Dev\website\app.py:75] +2025-05-10 23:13:37,640 INFO: Anwendung gestartet [in C:\Users\TTOMCZA.EMEA\Dev\website\app.py:75] +2025-05-10 23:14:35,907 INFO: Anwendung gestartet [in C:\Users\TTOMCZA.EMEA\Dev\website\app.py:75] +2025-05-10 23:14:37,804 INFO: Anwendung gestartet [in C:\Users\TTOMCZA.EMEA\Dev\website\app.py:75] +2025-05-10 23:14:37,804 INFO: Anwendung gestartet [in C:\Users\TTOMCZA.EMEA\Dev\website\app.py:75] +2025-05-10 23:14:44,251 INFO: Anwendung gestartet [in C:\Users\TTOMCZA.EMEA\Dev\website\app.py:75] +2025-05-10 23:14:46,088 INFO: Anwendung gestartet [in C:\Users\TTOMCZA.EMEA\Dev\website\app.py:75] +2025-05-10 23:14:46,088 INFO: Anwendung gestartet [in C:\Users\TTOMCZA.EMEA\Dev\website\app.py:75] diff --git a/templates/errors/400.html b/templates/errors/400.html new file mode 100644 index 0000000..7bd28df --- /dev/null +++ b/templates/errors/400.html @@ -0,0 +1,38 @@ +{% extends "base.html" %} + +{% block title %}400 - Ungültige Anfrage{% endblock %} + +{% block content %} +
+
+
+
+
+

400

+
+ +
+
+
+

Ungültige Anfrage

+

Die Anfrage konnte nicht verarbeitet werden. Bitte überprüfen Sie Ihre Eingaben und versuchen Sie es erneut.

+ {% if error %} +
+ {{ error }} +
+ {% endif %} + +
+
+
+

Benötigen Sie Hilfe? Kontaktieren Sie uns

+
+
+{% endblock %} \ No newline at end of file