Responses

Flaxon automatically converts return values to appropriate HTTP responses.

Automatic Conversion

@app.get("/")
async def home():
    # Dictionary → JSON
    return {"message": "Hello"}

@app.get("/users")
async def list_users():
    # List → JSON
    return [{"id": 1, "name": "Alice"}]

@app.get("/text")
async def text():
    # String → Text
    return "Hello, World!"

@app.get("/empty")
async def empty():
    # None → 204 No Content
    return None

@app.get("/file")
async def file():
    # Bytes → Octet-Stream
    return b"file content"

Response Classes

JSONResponse

from flaxon import JSONResponse

@app.get("/json")
async def json_response():
    return JSONResponse(
        {"status": "ok", "data": [1, 2, 3]},
        status_code=201,
        headers={"X-Custom": "value"},
    )

HTMLResponse

from flaxon import HTMLResponse

@app.get("/html")
async def html_response():
    return HTMLResponse("<h1>Hello</h1>", status_code=200)

TextResponse

from flaxon import TextResponse

@app.get("/text")
async def text_response():
    return TextResponse("Plain text", status_code=200)

RedirectResponse

from flaxon import RedirectResponse

@app.get("/old")
async def redirect():
    return RedirectResponse("/new", status_code=301)

# Or use the Redirect helper
from flaxon.http.redirects import Redirect

@app.get("/temp")
async def temp_redirect():
    return Redirect.temporary("/new")

StreamingResponse

from flaxon import StreamingResponse

async def generate_data():
    for i in range(10):
        yield f"Data {i}\n".encode()

@app.get("/stream")
async def stream():
    return StreamingResponse(
        generate_data(),
        media_type="text/plain",
    )

Status Codes

from flaxon.http.status import OK, CREATED, NO_CONTENT, BAD_REQUEST, NOT_FOUND

@app.get("/ok")
async def ok_response():
    return {"status": "ok"}, OK

@app.post("/users")
async def create_user():
    return {"created": True}, CREATED

@app.delete("/users/<int:user_id>")
async def delete_user(user_id: int):
    return None, NO_CONTENT

Custom Headers

@app.get("/headers")
async def custom_headers():
    return JSONResponse(
        {"data": "value"},
        headers={
            "X-Custom-Header": "custom-value",
            "X-Rate-Limit": "100",
        },
    )

Custom Response Class

from flaxon import Response

class CSVResponse(Response):
    media_type = "text/csv; charset=utf-8"

    def __init__(self, data: list[list[str]], **kwargs):
        content = "\n".join(",".join(row) for row in data)
        super().__init__(content, **kwargs)

@app.get("/export")
async def export():
    data = [["Name", "Email"], ["Alice", "alice@example.com"]]
    return CSVResponse(data, status_code=200)
Tip

You can return tuples like (data, status_code) or (data, headers) for quick responses.