chore: Änderungen commited

This commit is contained in:
2025-05-10 23:15:08 +02:00
parent 82d03f6c48
commit 1600647bc4
4 changed files with 115 additions and 0 deletions

Binary file not shown.

62
app.py
View File

@@ -5,6 +5,7 @@ import os
import logging import logging
import traceback import traceback
from datetime import datetime, timedelta, timezone 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 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_login import LoginManager, UserMixin, login_user, logout_user, login_required, current_user
from flask_sqlalchemy import SQLAlchemy from flask_sqlalchemy import SQLAlchemy
@@ -1710,20 +1711,78 @@ def get_dark_mode():
# Fehlerhandler # Fehlerhandler
@app.errorhandler(404) @app.errorhandler(404)
def page_not_found(e): 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 return render_template('errors/404.html'), 404
@app.errorhandler(403) @app.errorhandler(403)
def forbidden(e): 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 return render_template('errors/403.html'), 403
@app.errorhandler(500) @app.errorhandler(500)
def internal_server_error(e): 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 return render_template('errors/500.html'), 500
@app.errorhandler(429) @app.errorhandler(429)
def too_many_requests(e): 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 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 # OpenAI-Integration für KI-Assistenz
@app.route('/api/assistant', methods=['POST']) @app.route('/api/assistant', methods=['POST'])
def chat_with_assistant(): def chat_with_assistant():
@@ -2383,6 +2442,7 @@ def get_public_mindmap_nodes():
# Suchfunktion für Mindmap-Knoten # Suchfunktion für Mindmap-Knoten
@app.route('/api/search/mindmap', methods=['GET']) @app.route('/api/search/mindmap', methods=['GET'])
@handle_api_exception
def search_mindmap_nodes(): def search_mindmap_nodes():
""" """
Durchsucht Mindmap-Knoten nach einem Suchbegriff. Durchsucht Mindmap-Knoten nach einem Suchbegriff.
@@ -2489,6 +2549,7 @@ def search_mindmap_nodes():
# Export/Import-Funktionen für Mindmaps # Export/Import-Funktionen für Mindmaps
@app.route('/api/mindmap/<int:mindmap_id>/export', methods=['GET']) @app.route('/api/mindmap/<int:mindmap_id>/export', methods=['GET'])
@login_required @login_required
@handle_api_exception
def export_mindmap(mindmap_id): def export_mindmap(mindmap_id):
""" """
Exportiert eine Mindmap im angegebenen Format. Exportiert eine Mindmap im angegebenen Format.
@@ -2620,6 +2681,7 @@ def export_mindmap(mindmap_id):
@app.route('/api/mindmap/<int:mindmap_id>/import', methods=['POST']) @app.route('/api/mindmap/<int:mindmap_id>/import', methods=['POST'])
@login_required @login_required
@handle_api_exception
def import_mindmap(mindmap_id): def import_mindmap(mindmap_id):
""" """
Importiert Daten in eine bestehende Mindmap. Importiert Daten in eine bestehende Mindmap.

15
logs/app.log Normal file
View File

@@ -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]

38
templates/errors/400.html Normal file
View File

@@ -0,0 +1,38 @@
{% extends "base.html" %}
{% block title %}400 - Ungültige Anfrage{% endblock %}
{% block content %}
<div class="min-h-[75vh] flex flex-col items-center justify-center px-4 py-12 bg-gradient-to-b from-gray-50 to-gray-100 dark:from-gray-900 dark:to-gray-800">
<div class="glass-effect max-w-2xl w-full p-6 md:p-10 rounded-xl border border-gray-300/20 dark:border-gray-700/30 shadow-xl transform transition-all duration-300 hover:shadow-2xl">
<div class="text-center">
<div class="flex justify-center mb-6">
<div class="relative">
<h1 class="text-7xl md:text-8xl font-extrabold text-primary-600 dark:text-primary-400 opacity-90">400</h1>
<div class="absolute -top-4 -right-4 w-12 h-12 bg-red-500 rounded-full flex items-center justify-center animate-pulse">
<i class="fa-solid fa-exclamation text-white text-xl"></i>
</div>
</div>
</div>
<h2 class="text-2xl md:text-3xl font-semibold mb-4 text-gray-800 dark:text-gray-200">Ungültige Anfrage</h2>
<p class="text-gray-600 dark:text-gray-300 mb-8 max-w-lg mx-auto text-base md:text-lg">Die Anfrage konnte nicht verarbeitet werden. Bitte überprüfen Sie Ihre Eingaben und versuchen Sie es erneut.</p>
{% if error %}
<div class="mb-6 p-4 bg-red-100 dark:bg-red-900/30 text-red-800 dark:text-red-200 rounded-lg text-sm">
{{ error }}
</div>
{% endif %}
<div class="flex flex-col sm:flex-row gap-4 justify-center">
<a href="{{ url_for('index') }}" class="btn-primary transform transition-transform duration-300 hover:scale-105 px-6 py-3 rounded-lg">
<i class="fa-solid fa-home mr-2"></i>Zur Startseite
</a>
<a href="javascript:history.back()" class="btn-secondary transform transition-transform duration-300 hover:scale-105 px-6 py-3 rounded-lg">
<i class="fa-solid fa-arrow-left mr-2"></i>Zurück
</a>
</div>
</div>
</div>
<div class="mt-8 text-sm text-gray-500 dark:text-gray-400">
<p>Benötigen Sie Hilfe? <a href="#" class="text-primary-600 dark:text-primary-400 hover:underline">Kontaktieren Sie uns</a></p>
</div>
</div>
{% endblock %}