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 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-07-23 09:58:01 +02:00
parent 84ce596446
commit 4246e0d98f

View File

@@ -15,6 +15,7 @@ from collections import defaultdict
from datetime import date, datetime, timedelta, timezone from datetime import date, datetime, timedelta, timezone
from fastapi import APIRouter, Depends, HTTPException, status from fastapi import APIRouter, Depends, HTTPException, status
from fastapi.responses import Response
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from ..database import get_db from ..database import get_db
@@ -136,15 +137,22 @@ def put_layout(
return get_layout(db=db, user=user) return get_layout(db=db, user=user)
@router.delete("/layout", status_code=status.HTTP_204_NO_CONTENT) @router.delete("/layout")
def reset_layout( def reset_layout(
db: Session = Depends(get_db), user: User = Depends(get_current_user) db: Session = Depends(get_db), user: User = Depends(get_current_user)
) -> None: ) -> Response:
"""Eigene Anordnung verwerfen danach gilt wieder die Vorgabe.""" """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() row = db.query(DashboardLayout).filter(DashboardLayout.user_id == user.id).first()
if row is not None: if row is not None:
db.delete(row) db.delete(row)
db.commit() db.commit()
return Response(status_code=status.HTTP_204_NO_CONTENT)
@router.put("/layout/default", response_model=DashboardLayoutOut) @router.put("/layout/default", response_model=DashboardLayoutOut)