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.