41 lines
1.4 KiB
Python
41 lines
1.4 KiB
Python
# 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)
|