From 38f6ba9115ef046ef37933f984545dbea180b3ca Mon Sep 17 00:00:00 2001 From: Till Tomczak Date: Fri, 30 May 2025 18:49:58 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=80=20Refactor=20database=20connection?= =?UTF-8?q?=20for=20improved=20performance=20and=20stability.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/app.py | 89 ++++++++++++++++++++++++-------- backend/app/database/myp.db | Bin 106496 -> 106496 bytes backend/app/database/myp.db-shm | Bin 32768 -> 32768 bytes backend/app/database/myp.db-wal | Bin 0 -> 4152 bytes 4 files changed, 67 insertions(+), 22 deletions(-) diff --git a/backend/app/app.py b/backend/app/app.py index 6004d715..eab44337 100644 --- a/backend/app/app.py +++ b/backend/app/app.py @@ -306,26 +306,62 @@ def login(): error = None if request.method == "POST": - # Unterscheiden zwischen JSON-Anfragen und normalen Formular-Anfragen - is_json_request = request.is_json or request.headers.get('Content-Type') == 'application/json' + # Debug-Logging für Request-Details + auth_logger.debug(f"Login-Request: Content-Type={request.content_type}, Headers={dict(request.headers)}") - # Daten je nach Anfrageart auslesen - if is_json_request: - data = request.get_json() - username = data.get("username") or data.get("email") # Fallback für email - password = data.get("password") - remember_me = data.get("remember_me", False) - else: - # Korrigierte Feldnamen - Template verwendet "email" nicht "username" - username = request.form.get("email") # Geändert von "username" zu "email" - password = request.form.get("password") - remember_me = request.form.get("remember_me") == "on" # Geändert von "remember-me" + # Erweiterte Content-Type-Erkennung für AJAX-Anfragen + content_type = request.content_type or "" + is_json_request = ( + request.is_json or + "application/json" in content_type or + request.headers.get('X-Requested-With') == 'XMLHttpRequest' or + request.headers.get('Accept', '').startswith('application/json') + ) + + # Robuste Datenextraktion + username = None + password = None + remember_me = False + + try: + if is_json_request: + # JSON-Request verarbeiten + try: + data = request.get_json(force=True) or {} + username = data.get("username") or data.get("email") + password = data.get("password") + remember_me = data.get("remember_me", False) + except Exception as json_error: + auth_logger.warning(f"JSON-Parsing fehlgeschlagen: {str(json_error)}") + # Fallback zu Form-Daten + username = request.form.get("email") + password = request.form.get("password") + remember_me = request.form.get("remember_me") == "on" + else: + # Form-Request verarbeiten + username = request.form.get("email") + password = request.form.get("password") + remember_me = request.form.get("remember_me") == "on" + + # Zusätzlicher Fallback für verschiedene Feldnamen + if not username: + username = request.form.get("username") or request.values.get("email") or request.values.get("username") + if not password: + password = request.form.get("password") or request.values.get("password") + + except Exception as extract_error: + auth_logger.error(f"Fehler beim Extrahieren der Login-Daten: {str(extract_error)}") + error = "Fehler beim Verarbeiten der Anmeldedaten." + if is_json_request: + return jsonify({"error": error, "success": False}), 400 if not username or not password: - error = "Benutzername und Passwort müssen angegeben werden." + error = "E-Mail-Adresse und Passwort müssen angegeben werden." + auth_logger.warning(f"Unvollständige Login-Daten: username={bool(username)}, password={bool(password)}") if is_json_request: - return jsonify({"error": error}), 400 + return jsonify({"error": error, "success": False}), 400 else: + db_session = None try: db_session = get_db_session() # Suche nach Benutzer mit übereinstimmendem Benutzernamen oder E-Mail @@ -339,30 +375,39 @@ def login(): db_session.commit() login_user(user, remember=remember_me) - auth_logger.info(f"Benutzer {username} hat sich angemeldet") + auth_logger.info(f"Benutzer {username} hat sich erfolgreich angemeldet") next_page = request.args.get("next") - db_session.close() if is_json_request: - return jsonify({"success": True, "redirect_url": next_page or url_for("index")}) + return jsonify({ + "success": True, + "message": "Anmeldung erfolgreich", + "redirect_url": next_page or url_for("index") + }) else: if next_page: return redirect(next_page) return redirect(url_for("index")) else: - error = "Ungültiger Benutzername oder Passwort." + error = "Ungültige E-Mail-Adresse oder Passwort." auth_logger.warning(f"Fehlgeschlagener Login-Versuch für Benutzer {username}") - db_session.close() if is_json_request: - return jsonify({"error": error}), 401 + return jsonify({"error": error, "success": False}), 401 except Exception as e: # Fehlerbehandlung für Datenbankprobleme error = "Anmeldefehler. Bitte versuchen Sie es später erneut." auth_logger.error(f"Fehler bei der Anmeldung: {str(e)}") if is_json_request: - return jsonify({"error": error}), 500 + return jsonify({"error": error, "success": False}), 500 + finally: + # Sicherstellen, dass die Datenbankverbindung geschlossen wird + if db_session: + try: + db_session.close() + except Exception as close_error: + auth_logger.error(f"Fehler beim Schließen der DB-Session: {str(close_error)}") return render_template("login.html", error=error) diff --git a/backend/app/database/myp.db b/backend/app/database/myp.db index 7a498da4b5a5275876c7f84f12066a38b4b2af10..348f43530030066433d20720ef0a739d1f34040e 100644 GIT binary patch delta 487 zcmZoTz}9epZ9|~EslQQaxlf@_MQTVvL}jK&ewcTNOMriYlciCKWk7*ZdQNe2T3Di& zNqLo{iEE{0T4IrFuJ`0Nc@rID0|i41D-&ZYQ$sy-OLI#L10w??Q(Xg7T~rxMBMbA* z&*T*p_zDLGlN0>KHaqy3Gcxv1PV^U@-0NEgG>#S7 zI8i?gYVImI;&uRvK1wM7&OrF(1SI*{PZnS2ZoU^xH2+LLa|{ z0E;pwBf_7lEIcgI9E|yCX*rpBscZ}k44hyNx-!|FdHivFH%t07Qo2jz{A3S co&jk3ZT|E8Uw~%s=bwIiJ|j0H3y4w$0FrTuBLDyZ delta 406 zcmZoTz}9epZ9|~Esh+WSX;HF^kCT6@Z=rsflec4ecz&vrp`U(4ppQ{;n1Q!RL{3n0 zk)?l>TUClzMT%ZvVCLjDc@rHYO9ewqD$orR8MirLqAz zoG=b6GKXdJt^djf%w`J4ixd>L1u(KWa53}WW&j#?oBs>YptJnb&(CM%p8jk;qZ9z} CRByuo diff --git a/backend/app/database/myp.db-shm b/backend/app/database/myp.db-shm index 6ce06244aa0020b8b67203674d99b57bcb7af838..0ddbc85db1810a3241434e8eb88f08c2cfeb4469 100644 GIT binary patch delta 156 zcmZo@U}|V!s+V}A%K!o#K+MR%AOOS+Qb4?aUEso2lZO`e3!Uu$)_7kvwZ8B0N?p-~ oRP{ikzyM_KeSI6$jG;G;%`<)PLKdM69Y2?3(#OT2KJ2;-*Yf>ZJhX>n~?*of_vjcX)ypg CLqT8w diff --git a/backend/app/database/myp.db-wal b/backend/app/database/myp.db-wal index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..020ad64824bd80b84576f0e9257e7757364c70f3 100644 GIT binary patch literal 4152 zcmXr7XKP~6eI&uaAiw|wto93??EltyUzOBc60|zz#}}ZOFc3?@#1{sx+i&sEq?H#a z$jj%%z<-N>9seT!CjL}@TYhoAk9=48w(`y3D*{T5g3%Bd4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5CDdN9xscgy>NPIYH>+?QEDNGF3wD;h({HPFD^+eDJ?cpFjC=R z5jB_2%1;8T0?|;p_>#=r)M7&gFqGzI5!Dq&QB_);S`?p|0+g2HVi7e)l`JUA%qxM( zOL4M@YNN_StOx2<;b0NB6$Y7ATwIuwS&|x`SXz>wnU|7U5f2uPHw39-C#1>