Requests

The Request class provides access to all incoming request data.

Accessing the Request

from flaxon import Request

@app.get("/")
async def home(request: Request):
    return {"method": request.method, "path": request.path}

Request Properties

@app.get("/info")
async def info(request: Request):
    return {
        "method": request.method,
        "path": request.path,
        "scheme": request.scheme,
        "host": request.host,
        "url": request.url,
        "client": request.client,
    }

Headers

@app.get("/headers")
async def get_headers(request: Request):
    return {
        "user_agent": request.headers.get("user-agent"),
        "content_type": request.headers.get("content-type"),
        "all_headers": dict(request.headers),
    }

Query Parameters

@app.get("/search")
async def search(request: Request):
    # Single value
    q = request.query.get("q")
    page = request.query.get("page", 1)

    # Multiple values
    filters = request.query.get_list("filter")

    # Type conversion
    page_int = request.query.get_int("page", 1)
    active = request.query.get_bool("active", False)

    return {"query": q, "page": page, "filters": filters}

Cookies

@app.get("/profile")
async def profile(request: Request):
    session_id = request.cookies.get("session_id")
    theme = request.cookies.get("theme", "light")

    return {"session_id": session_id, "theme": theme}

Reading the Body

JSON Body

@app.post("/users")
async def create_user(request: Request):
    data = await request.json()
    return {"received": data}

Text Body

@app.post("/text")
async def handle_text(request: Request):
    text = await request.text()
    return {"length": len(text)}

Raw Bytes

@app.post("/binary")
async def handle_binary(request: Request):
    data = await request.body()
    return {"size": len(data)}

Form Data

@app.post("/form")
async def handle_form(request: Request):
    form = await request.form()
    return {"name": form.get("name"), "email": form.get("email")}

Validation with Schemas

from flaxon.validation import Schema, fields

class CreateUser(Schema):
    name = fields.String(required=True, min_length=2)
    email = fields.Email(required=True)
    age = fields.Integer(required=False, minimum=13)

@app.post("/users")
async def create_user(data: CreateUser):
    # data is automatically validated
    return {"user": data.to_dict()}

Combining Parameters

from flaxon.validation import Schema, fields

class SearchParams(Schema):
    q = fields.String(required=True, min_length=1)
    page = fields.Integer(default=1, minimum=1)
    per_page = fields.Integer(default=20, minimum=1, maximum=100)

@app.get("/api/search")
async def search(request: Request, params: SearchParams):
    return {
        "query": params.q,
        "page": params.page,
        "per_page": params.per_page,
    }
Tip

The Request object also has a .state attribute for storing request-scoped data.