From 4246e0d98fc703471746c82a16b97c84052029a2 Mon Sep 17 00:00:00 2001 From: Scarriffle Date: Thu, 23 Jul 2026 09:58:01 +0200 Subject: [PATCH] Fix Startabbruch: 204-Route in dashboard.py brach den Backend-Start ab AssertionError beim Import: "Status code 204 must not have a response body". Ursache ist eine Wechselwirkung, die nur in dieser Datei auftritt: dashboard.py nutzt "from __future__ import annotations". Dadurch ist die Rueckgabeangabe "-> None" eine Zeichenkette, die FastAPI zu NoneType aufloest und als Antwortmodell wertet. Zusammen mit status_code=204 - das keinen Rumpf haben darf - schlaegt die Pruefung beim Registrieren der Route fehl und das Backend startet gar nicht. Andere Router im Projekt haben dieses __future__-Import nicht, deshalb funktioniert dasselbe Muster dort. Die Route folgt jetzt dem bereits bewaehrten Muster aus branding.py: Der Statuscode steht am Response, nicht im Dekorator. Der Grund steht als Kommentar an der Funktion, damit die Falle nicht erneut zuschnappt. Geprueft: Alle uebrigen Routen der Datei haben ein explizites response_model im Dekorator und sind davon nicht betroffen. Ein Start des Backends konnte ich hier nicht pruefen - auf diesem Rechner ist weder Python noch Docker vorhanden. Co-Authored-By: Claude Opus 4.8 --- backend/app/routers/dashboard.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/backend/app/routers/dashboard.py b/backend/app/routers/dashboard.py index a1d35bc..da89069 100644 --- a/backend/app/routers/dashboard.py +++ b/backend/app/routers/dashboard.py @@ -15,6 +15,7 @@ from collections import defaultdict from datetime import date, datetime, timedelta, timezone from fastapi import APIRouter, Depends, HTTPException, status +from fastapi.responses import Response from sqlalchemy.orm import Session from ..database import get_db @@ -136,15 +137,22 @@ def put_layout( return get_layout(db=db, user=user) -@router.delete("/layout", status_code=status.HTTP_204_NO_CONTENT) +@router.delete("/layout") def reset_layout( db: Session = Depends(get_db), user: User = Depends(get_current_user) -) -> None: - """Eigene Anordnung verwerfen – danach gilt wieder die Vorgabe.""" +) -> Response: + """Eigene Anordnung verwerfen – danach gilt wieder die Vorgabe. + + Der Statuscode steht bewusst am Response und nicht im Dekorator: Durch + ``from __future__ import annotations`` wird ``-> None`` zu einer Zeichenkette, + die FastAPI zu ``NoneType`` auflöst und als Antwortmodell wertet – zusammen + mit 204 (das keinen Rumpf haben darf) bricht der Start dann ab. + """ row = db.query(DashboardLayout).filter(DashboardLayout.user_id == user.id).first() if row is not None: db.delete(row) db.commit() + return Response(status_code=status.HTTP_204_NO_CONTENT) @router.put("/layout/default", response_model=DashboardLayoutOut)