From 1600647bc4a0dd6137fd509a3694504b8c36374f Mon Sep 17 00:00:00 2001 From: Till Tomczak Date: Sat, 10 May 2025 23:15:08 +0200 Subject: [PATCH] =?UTF-8?q?chore:=20=C3=84nderungen=20commited?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __pycache__/app.cpython-313.pyc | Bin 115387 -> 123073 bytes app.py | 62 ++++++++++++++++++++++++++++++++ logs/app.log | 15 ++++++++ templates/errors/400.html | 38 ++++++++++++++++++++ 4 files changed, 115 insertions(+) create mode 100644 logs/app.log create mode 100644 templates/errors/400.html diff --git a/__pycache__/app.cpython-313.pyc b/__pycache__/app.cpython-313.pyc index c7f01c4843f0294667400b7b7015bcee68df7aae..a39f09ab24e10b872e6e0df4873e5fd06f330c33 100644 GIT binary patch delta 27249 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 C#ek#$ delta 20876 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 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