Files
ad/molodetz/responses.py
T

41 lines
1.4 KiB
Python
Raw Normal View History

2026-10-05 09:36:20 +02:00
# retoor <retoor@molodetz.nl>
import logging
from fastapi.responses import JSONResponse, RedirectResponse
logger = logging.getLogger(__name__)
def wants_json(request):
content_type = request.headers.get("content-type", "")
if content_type.startswith("application/json"):
return True
accept = request.headers.get("accept", "")
return "application/json" in accept and "text/html" not in accept
def json_error(status_code, message, **extra):
body = {"status": status_code, "message": message}
body.update(extra)
return JSONResponse({"error": body}, status_code=status_code)
def respond(request, template, ctx, *, model, status_code=200):
if wants_json(request):
try:
payload = model.model_validate(ctx).model_dump(mode="json")
except Exception:
logger.exception("schema validation failed for %s", model.__name__)
return json_error(500, "Response serialization failed")
return JSONResponse(payload, status_code=status_code)
from molodetz.templating import templates
context = dict(ctx)
return templates.TemplateResponse(request, template, context, status_code=status_code)
def action_result(request, redirect_url, *, data=None, status_code=302):
if wants_json(request):
return JSONResponse({"ok": True, "redirect": redirect_url, "data": data})
return RedirectResponse(redirect_url, status_code=status_code)