1 带类型的路径参数:就是函数参数定义具有类型声明
2 数据转换:就是fastapi 会将URL中的str按照参数类型声明自定转换
3 数据验证:当数据转换失败是就会报错
4 文档:自动的,交互式的api文档
5 基于标准的好处,替代文件:就是替代的api文档
6 pydantic:所有数据验证都由pydantic再后台执行。
7 路径顺序:后台识别 /users/me 和 /users/{user_id} 时,根据定义的顺序派发
8 预定义值: 就是接受的url参数必须是预定义好的enum中的值,同时检查文档会列举出可用的枚举值。
9 包含路径的路径参数:就是参数仍然是一个路径。/files/{home/johndoe/myfile.txt.}
10 openapi支持: openapi不支持函数参数声明 类型为路径参数,但人可以使用starlette的内部工具进行操作
11 路径转换器:starlette使用路径参数时,在url中声明路径参数类型:/files/{file_path:path}
@ 查询参数:当你声明不属于路径参数的其他函数参数时,他们会自动解释为查询参数 url声明中没有参数,但在使用url时 可以通过在 URL后面的?加一组键值对,由&字符分隔多个参。http://127.0.0.1:8000/items/?skip=0&limit=10
@ 默认值:由于查询参数不是路径的固定部分,它们可以是可选的并且可以具有默认值。
@可选参数:您可以声明可选的查询参数,方法是将其默认设置为None,等同于默认值就是None的情况,但要使用Optional[str]=None
@理解路径参数和查询参数
@查询参数类型转换:就是根据你参数声明的类型进行格式转换,特别注意代表True的有1,True,true,on,yes以及其他大小写变化情况。
@多个路径和查询参数:就是在url路径中有多个查询参数。 @app.get("/users/{user_id}/items/{item_id}")
@必须的查询参数:但是当你想让一个查询参数成为必需时,你可以不声明任何默认值:
@ 请求正文是什么?就是游览器发送到你api接口的数据,但注意不是url。
@pydantic model的作用:就是为了替代函数的参数声明,必须,默认,可选参数声明都是一样的
@ pydantic model只能通过查询参数声明吗,能否进行路径参数声明?
@ 使用model时
- 将请求正文读取为 JSON。
- 转换相应的类型(如果需要)。
- 验证数据。
- 如果数据无效,它将返回一个很好且清晰的错误,指出错误数据的确切位置和内容。
- 在参数中给你接收到的数据item。
- 当您在函数中将其声明为 type 时Item,您还将拥有所有属性及其类型的所有编辑器支持(完成等)。
- 为您的模型生成JSON 模式定义,如果对您的项目有意义,您也可以在任何其他您喜欢的地方使用它们。
- 这些模式将是生成的 OpenAPI 模式的一部分,并由自动文档UI 使用。
@自动文档:model的json模式会在api文档中显示出来
@编辑器对model的支持:在pycharm中下载pydantic插件,更好的帮助
@在函数内部,你可以直接访问model的所有属性
@ 请求正文+路径参数:FastAPI会识别出匹配路径参数的函数参数应该从路径中获取,声明为 Pydantic 模型的函数参数应该从请求体中获取。
@请求正文+路径+查询参数:函数参数将被识别如下:
- 如果参数也在path 中声明,它将用作路径参数。
- 如果参数是一个的单一类型(如int,float,str,bool,等等)将被解释为一个查询参数。
- 如果参数被声明为Pydantic 模型的类型,它将被解释为请求正文。
@ 使用query 作为参数声明的附加信息和验证信息:
async def read_items(q: Optional[str] = Query(None, max_length=50)):
pass
@ 参数添加正则表达式
async def read_items( q: Optional[str] = Query(None,max_length=50, regex="^fixedquery$")):
Pass
@ query也可以有默认值(不是None),具有默认值使参数成为可选的:
async def read_items(q: str = Query("fixedquery", min_length=3)):
Pass
@query成为必须参数,使用 … 作为第一个参数即可
@查询参数列表/多个值
async def read_items(q: Optional[List[str]] = Query(None)): 可以在url中多次出现q 查询参数
要声明类型为list的查询参数,如上面的示例,您需要显式使用Query,否则它将被解释为请求正文。
@查询参数列表具有多个值:
async def read_items(q: List[str] = Query(["foo", "bar"])):
@ 使用query 添加更过的附加信息:包括title,desciption,别名(用于声明url可用,但python不支持的变量声明),弃用参数(有客户再用,但已经确定不会使用的)
@ query用于查询参数,同理路径参数可以使用path
@path 的所有参数都与query相同
@ path指定路径参数,你可以使用 … 参数,即使你使用了None或默认值,也不会影响任何事情,它仍然使必须的。
@ 根据需要订购参数:就是指 函数的参数安排可以没有顺序,fastapi会处理好的
@ python 函数*号后面的参数都会作为关键字参数调用,即使它们没有默认值
@ query和path的数字约束,ge,大于等于,gt、le。浮点数也是这个
@path显示指定路径参数,query显示指定查询参数,body显示指定正文参数。默认情况下,奇异值被解释为查询参数,就是声明为 Optional[str] 的变量
@ 混用path、query,model,model是从请求正文中取出的
@ url中可以插入json正文
@默认情况下,奇异值被解释为查询参数,如果你希望参数是保存在主体而不是作为一个查询参数,你就可以使用body声明
@app.put("/items/{item_id}")
async def update_item( *, item_id: int, user: User, importance: int = Body(..., gt=0), q: Optional[str] =None ):
其中item_id为路径参数,user为主体,importance为主体,q为查询(因为他是奇异值)
@ 默认情况,model期望一个主体,但如果你希望一个带有键的 JSONitem时(默认没有键,就是直接是参数),可以使用body参数中的embed。
@fastapi中的body参数 对应于pydantic中的field参数。作用为为模型属性声明额外的验证和元数据
@Field与Query,Path和 的工作方式相同Body,它具有所有相同的参数等。
@ 使用FastAPI,您可以定义、验证、记录和使用任意深度嵌套的模型(感谢 Pydantic)。
@使用List[str] 指定参数类型为包含str的 list, List定义在typing模块中,同理可以使用Set,Dic
@ Pydantic 模型的每个属性都有一个类型。这个类型还可以是Pydantic 类型,同时嵌套的声明也会得到编辑器支持,数据转换,验证和自动化文档等
@ pydantic具有一些特殊类型和验证,比如说HttpUrl类型而不是str类型。具体请看:https://pydantic-docs.helpmanual.io/usage/types
@ 如果你期望函数参数json主体是list而不是dict(默认),可以在函数声明时将model用列表括起来,而不是直接声明model
@ 定义函数参数类型为一个dict:weights: Dict[int, float] 时,可以接受任意的json主体,(Pydantic 模型就是这种情况),如果你想接受你不知道的key,这非常有用
@ 请记住,JSON 仅支持str作为键。但是 Pydantic 有自动数据转换。这意味着,即使您的 API 客户端只能将字符串作为键发送,只要这些字符串包含纯整数,Pydantic 就会转换它们并验证它们。
@ 你可以声明你的接口可以接收的数据示例。主要目的就是为了显示在自动文档中。
@ pydantic模型可以使用field参数中的example字段定义 示例,和model中定义一致。
@ path,query,header,cookie,body,form,file, 参数都可以定义example
@允许定义多个example
@ 可以使用以下特殊类型: uuid(在请求和响应中将表示为str),datetime(python模块datetime中的),date(python模块datetime中的),time(python模块datetime中的),timedelta,frozenset(就是set),bytes(在请求和响应中都是str),decimal(请求与响应等同float),以及其他pydantic数据类型。
@这些类型在python及其model中都可以使用
@可以像query和path参数一样定义cookie参数
@ 声明cookie参数后,你必须使用cookie,否者参数将会被解释为查询参数。
@ 像quey,path和cookie一样定义header参数。
@声明header后,你必须使用Header,否者参数将会被解释为查询参数
@多数标头具有减号‘--’,但是这样的变量在python中是无效的,所以header参数将会把下划线转化为减号以提取和记录标头。
@http标头不区分大小写
@通过设置header的convert_underscores字段禁用fastapi的 自动转换。
@请记住某些http代理服务器不允许使用带下划线的标头
@重复的标题:使用list + str 接收重复的标头