一、基本使用
查询参数是什么呢?一般前台发送的请求可能是这样的 http://127.0.0.1:8000/items/?skip=0&limit=10 那么"?"之后的就是查询参数每个查询参数直接通过“&”进行连接。查询参数:
- skip:值为0
- limit:值为10
那么在FastAPI的后台就需要进行接收。
1、可选、非可选查询参数
from fastapi import FastAPI app = FastAPI() @app.get("/query") async def page_limit(skip: int = 1, limit: int = 10): return {"skip": skip, "limit": limit}
在上述实例中声明了两个查询参数的类型是int,并且都有自己的默认值,查询参数与路径参数不同,它不是路径的一部分,所以是可选的。你可以通过下面的请求方式均可:
# 请求一 http://127.0.0.1:8000/query # 请求二 http://127.0.0.1:8000/query?skip=1 # limit值为空 # 请求三 http://127.0.0.1:8000/query?limit=10 # skip值为空 # 请求四 http://127.0.0.1:8000/query?skip=1&limit=10
其最终的返回结果均是:
{ "skip": 1, "limit": 10 }
当然还可以通过类型声明来进行控制:
from fastapi import FastAPI from typing import Optional app = FastAPI() @app.get("/query") async def page_limit(skip: Optional[int] = 1, limit: Optional[int] = 10): return {"skip": skip, "limit": limit}
通过Optional来声明skiip查询参数是可选的int类型,并且默认值是1.。limit同理如此。但是这样用就和之前没有Optional的没啥区别了,所以一般可以这样使用:
from fastapi import FastAPI from typing import Optional app = FastAPI() @app.get("/query") async def page_limit(skip: int = 1, limit: Optional[int] = None): if limit: return {"skip": skip, "limit": limit} return {"skip": skip}
通过判断前台是否传递这个参数的值,来进行返回。
在上述可选查询参数中注意:
- 如果没有默认值就是必选(必填)参数
- 如果有默认值就是可选(非必填)参数
- 如果只是想成为可选参数而不想给一个特定的默认值,就使用Optional并且默认值为None
2、bool类型转换
如果声明的查询参数是bool类型,它们将会被自动转换:
from fastapi import FastAPI app = FastAPI() @app.get("/query/bool/conversion") async def type_conversion(param: bool = False): return param
当访问以下路由:
# 路由一 http://127.0.0.1:8000/query/bool/conversion?param=yes # 路由二 http://127.0.0.1:8000/query/bool/conversion?param=on # 路由三 http://127.0.0.1:8000/query/bool/conversion?param=true # 路由四 http://127.0.0.1:8000/query/bool/conversion?param=True # 路由五 http://127.0.0.1:8000/query/bool/conversion?param=1
返回值均为true。
3、路径参数与查询参数
上述只是单纯的查询参数,那么实际上路由中既可以有路径参数,同时也可以有查询参数。FastAPI可以识别它们,并且不需要特定的顺序。
from fastapi import FastAPI from typing import Optional app = FastAPI() @app.get("/multi/params/{item_id}") async def multi_params(item_id: int, skip: int = 1, limit: Optional[int] = None): item = {"item_id":item_id,"skip":skip} if limit: item.update({"limit":limit}) return item
上述中:
- item_id 是路径参数,是必填参数
- skip 是查询参数,是选填参数,默认是1
- limit 是查询参数,是选填参数,默认值是None
二、进阶
同路径参数中的Path类似,查询参数也提供了一个Query模块提供功能更加完善的参数校验。
from fastapi import FastAPI from fastapi import Query from typing import List app = FastAPI() @app.get("/query/validations") def query_params_validate( value: str = Query(...,min_length=3,max_length=6,regex="^z"), values: List[str] = Query(["V1","V2"]) ): return value,values
上述中:
- value 必选参数(存在"...")
- values 非必选参数(存在默认值)
调用接口:
通过查看源码,更多校验参数:
class Query(Param): in_ = ParamTypes.query def __init__( self, default: Any, *, alias: Optional[str] = None, title: Optional[str] = None, description: Optional[str] = None, gt: Optional[float] = None, ge: Optional[float] = None, lt: Optional[float] = None, le: Optional[float] = None, min_length: Optional[int] = None, max_length: Optional[int] = None, regex: Optional[str] = None, example: Any = Undefined, examples: Optional[Dict[str, Any]] = None, deprecated: Optional[bool] = None, **extra: Any, ): ... ...