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.