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 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)