Query Parameters
When you declare other function parameters that are not part of the path parameters, they are automatically interpreted as "query" parameters.
nums = list(range(100))
@app.get("/nums")
def get_nums(limit: int = 10, offset: int = 0):
return {"results": nums[offset: offset + limit]}
To query this operation, you use a URL like:
http://localhost:5000/nums?offset=0&limit=10
The same benefits that apply to path parameters also apply to query parameters:
- Editor support (obviously)
- Data "parsing"
- Data validation
- Automatic documentation
Note: if you do not annotate your arguments, they will be treated as str
types:
@app.get("/nums")
def get_nums(limit, offset):
# type(limit) == str
# type(offset) == str
Defaults
As query parameters are not a fixed part of a path, they are optional and can have default values:
@app.get("/nums")
def get_nums(limit: int = 10, offset: int = 0):
return nums[offset: offset + limit]
In the example above we set default values of offset=0
and limit=10
.
So, going to the URL:
http://localhost:5000/nums
http://localhost:5000/nums?offset=0&limit=10
http://localhost:5000/nums?offset=20
the parameter values in your function will be:
offset=20
(because you set it in the URL)limit=10
(because that was the default value)
Required and optional parameters
You can declare required or optional GET parameters in the same way as declaring Python function arguments:
nums = list(range(100))
@app.get("/nums")
def get_nums(greater_than: int, offset: int = 10):
results = [num for num in nums if num > greater_than]
return {"results": results[offset: offset + 10]}
In this case, Flask Sugar will always validate that you pass the greater_than
param in the GET, and the offset
param is an optional integer.
More validation by pydantic
from flask_sugar import Sugar, Query
app = Sugar(__name__)
@app.get("/nums")
def get_nums(limit: Optional[int] = Query(default=10, le=25), offset: Optional[int] = Query(default=0)):
return nums[offset: offset + limit]
In the example above we set default values of offset=0
and limit=10
, and Flask Sugar will always validate the limit
must be less than or equal to 25.
GET parameters type conversion
Let's declare multiple type arguments:
from datetime import date
@app.get("/example")
def example(s: str = None, b: bool = None, d: date = None, i: int = None):
return {"value": [s, b, d, i]}
str
type is passed as is.
For the bool
type, all the following:
http://localhost:5000/example?b=1
http://localhost:5000/example?b=True
http://localhost:5000/example?b=true
http://localhost:5000/example?b=on
http://localhost:5000/example?b=yes
b
with a bool
value of True
, otherwise as False
.
Date can be both date string and integer (unix timestamp):
http://localhost:5000/example?d=1577836800 # same as 2020-01-01
http://localhost:5000/example?d=2020-01-01