Skip to content

Request Parameters

Extract query, header, and cookie parameters in sillo handlers and dependencies

sillo provides a clean, declarative way to extract query parameters, HTTP headers, and cookies directly in your handlers and dependencies using Query, Header, and Cookie parameter extractors.

from sillo import silloApp, Query, Header, Cookie
app = silloApp()
@app.get("/search")
async def search(
request, response,
q: str = Query(""),
limit: int = Query(10),
authorization: str = Header()
):
return {"query": q, "limit": limit, "auth": authorization}

Use Query() to extract query string parameters with automatic type conversion.

@app.get("/items")
async def get_items(
request, response,
page: int = Query(1),
limit: int = Query(10)
):
return {"page": page, "limit": limit}

Request: GET /items?page=2&limit=20 Result: {"page": 2, "limit": 20}

@app.get("/search")
async def search(request, response, q: str = Query("default query")):
return {"query": q}

Request: GET /search Result: {"query": "default query"}

When no default is provided, the parameter returns None if not present:

@app.get("/filter")
async def filter(request, response, tag: str = Query()):
return {"tag": tag}

Query() automatically converts string values to the type of the default:

Default TypeConversion
intint(value)
floatfloat(value)
bool"true"/"1"/"yes"True, others → False
list[str]Split by comma
strNo conversion
@app.get("/convert")
async def convert(
request, response,
count: int = Query(0),
price: float = Query(0.0),
active: bool = Query(False)
):
return {"count": count, "price": price, "active": active}

Use alias to map a different query parameter name:

@app.get("/users")
async def users(request, response, page_num: int = Query(1, alias="page")):
return {"page": page_num}

Request: GET /users?page=5 Result: {"page": 5}

Use required=True to enforce presence:

@app.get("/search")
async def search(request, response, q: str = Query(required=True)):
return {"query": q}

Use Header() to extract HTTP headers with automatic name conversion.

Header names are automatically converted from Python naming to HTTP canonical format:

Parameter NameHeader Name
authorizationAuthorization
content_typeContent-Type
x_request_idX-Request-Id
user_agentUser-Agent
@app.get("/api")
async def api(request, response, authorization: str = Header()):
return {"auth": authorization}

Request: GET /api with header Authorization: Bearer token123 Result: {"auth": "Bearer token123"}

@app.get("/version")
async def version(request, response, api_key: str = Header(default="guest")):
return {"api_key": api_key}

Use alias for non-standard or custom header names:

@app.get("/custom")
async def custom(request, response, token: str = Header(alias="X-API-Token")):
return {"token": token}

Request: GET /custom with header X-API-Token: secret123 Result: {"token": "secret123"}


Use Cookie() to extract cookie values.

@app.get("/settings")
async def settings(request, response, theme: str = Cookie("light")):
return {"theme": theme}

Request: GET /settings with cookie theme=dark Result: {"theme": "dark"}

@app.get("/session")
async def session(request, response, session_id: str = Cookie()):
return {"session": session_id}

Parameter extractors work seamlessly in nested dependencies—no need for Context:

def get_pagination(page: int = Query(1), limit: int = Query(10)):
return {"page": page, "limit": limit}
@app.get("/items")
async def get_items(
request, response,
pagination: dict = Depend(get_pagination)
):
return {"items": [], "pagination": pagination}

Request: GET /items?page=3&limit=25 Result: {"items": [], "pagination": {"page": 3, "limit": 25}}

def get_auth(authorization: str = Header()):
if not authorization:
raise ValueError("No authorization")
return {"token": authorization}
@app.get("/profile")
async def profile(request, response, auth: dict = Depend(get_auth)):
return auth
def get_preferences(theme: str = Cookie("dark"), lang: str = Cookie("en")):
return {"theme": theme, "language": lang}
@app.get("/settings")
async def settings(request, response, prefs: dict = Depend(get_preferences)):
return prefs
def get_context(
page: int = Query(1),
authorization: str = Header(),
theme: str = Cookie("dark")
):
return {"page": page, "auth": authorization, "theme": theme}
@app.get("/dashboard")
async def dashboard(request, response, ctx: dict = Depend(get_context)):
return ctx

sillo provides two ways to access request data in dependencies:

from sillo import Query, Header, Cookie, Depend
def get_user_data(
page: int = Query(1),
authorization: str = Header()
):
return {"page": page, "token": authorization}
@app.get("/data")
async def get_data(request, response, data: dict = Depend(get_user_data)):
return data

Advantages:

  • Clean, declarative API
  • Automatic type conversion
  • Works with nested dependencies
  • Self-documenting parameters
from sillo import Depend
from sillo.dependencies import Context
def get_user_data(context: Context = None):
page = context.request.query_params.get("page", "1")
authorization = context.request.headers.get("Authorization")
return {"page": page, "token": authorization}

Disadvantages:

  • Manual type conversion required
  • More verbose
  • Accessing request attributes directly

Parameters automatically appear in your OpenAPI documentation. sillo generates proper OpenAPI parameter objects with correct types, locations, and default values.

Given this handler:

@app.get("/items")
async def get_items(
request, response,
page: int = Query(1),
limit: int = Query(10),
authorization: str = Header()
):
return {"page": page}

The generated OpenAPI spec includes:

{
"/items": {
"get": {
"parameters": [
{
"name": "page",
"in": "query",
"schema": {"type": "integer", "default": 1},
"required": false
},
{
"name": "limit",
"in": "query",
"schema": {"type": "integer", "default": 10},
"required": false
},
{
"name": "Authorization",
"in": "header",
"schema": {"type": "string"},
"required": true
}
]
}
}
}
  • Automatic type inference: intinteger, floatnumber, boolboolean, strstring
  • Header name conversion: authorizationAuthorization, x_request_idX-Request-Id
  • Default values: Included in schema for documentation
  • Required status: Automatically determined from required=True or when no default is provided
  • Aliases: Respected for custom parameter names

Query(default=…, *, alias=None, required=False)

Section titled “Query(default=…, *, alias=None, required=False)”

Extract query parameters.

ParameterTypeDescription
defaultAnyDefault value if param not provided
aliasstrCustom query parameter name
requiredboolRaise error if param missing

Header(default=…, *, alias=None, required=False)

Section titled “Header(default=…, *, alias=None, required=False)”

Extract HTTP headers. Auto-converts parameter names to canonical header names.

ParameterTypeDescription
defaultAnyDefault value if header not present
aliasstrCustom header name
requiredboolRaise error if header missing

Cookie(default=…, *, alias=None, required=False)

Section titled “Cookie(default=…, *, alias=None, required=False)”

Extract cookie values.

ParameterTypeDescription
defaultAnyDefault value if cookie not present
aliasstrCustom cookie name
requiredboolRaise error if cookie missing