fastapi接口定义与pydantic库的使用

准备接口

fastapi的接口测试地址是地址后加docs
初始化app=FastAPI(),之后定义路由@app.get('/'):

  • 路径参数:用大括号包裹 /city/{city}?q=xx
@app.put("/items/{item_id}")
async def update_item(*, item_id: int, item01: Item, user: User):
    results = {"item_id": item_id, "item01": item, "user": user}
    return results,item01.dict()
  • 查询参数:直接定义在def的参数中,query_string:str , 前端访问的时候通过?query_string=xx即可
  • 路径参数:{file_path:path},通过添加path标识,来正确识别提取路径。def中参数填写file_path:str

参数校验:

声明路径参数的元数据和查询路径元数据类似,区别就是路径参数使用的是Path、查询参数使用的Query

  • 路径参数验证:先导入路径校验类 from fastapi import Path 之后在def中通过 num: int = Path(…,ge=1,le=10,title=“标题”,description=“描述”) ...表示必填填写None容易产生歧义。可以点进去查看Path类的源码
@app.get("/metadata/{item}")
def read_metadata(item_id: int = Path(..., title="路径参数",
                                      alias="item", description="描述信息...", gt=0, le=1000)):
    results = {"item_id": item_id}
    return results
# title 和 description 主要是显示在文档(可能有些浏览器不显示title)
# alias 是为item_id取的别名,此时有了别名后,记得把@app.get("/metadata/{item_id}")替换成@app.get("/metadata/{item}")
  • 查询参数校验用 from fastapi import Query。在def中,value:str=Query(...,min_length=8,max_length=16,regex="^a") 表示参数为字符串类型,以a开头。values:List[str]=Query(default=["v1","v2"], alias="别名") 表示列表中的项为str,别名显示在docs中e:int = Query(ge=0,description="数字类型校验",default=0)。使用Query(None)可以替换默认值None,Query的第一个参数同样也是用于定义默认值q: str = Query(None)等同于q: str = None,对于str类型也等同于q: Optional[str] = None。以下表示非必须参数 q: Optional[list[str]] = Query(None)

    如果查询参数需要声明元数据,则使用Query来定义,如果不需要则可使用q: int,但是前提要在函数的第一个参数位置放置一个*号。
    Python 不会对该 *做任何事情,但是它将知道之后的所有参数都应作为关键字参数(键值对),也被称为 kwargs,来调用。

  • cookie参数:from fastapi import Cookie只能通过postman测试,docs是测试不了的 def cookie(cookie_test:Optional[str]=Cookie(None)) 什么都不传,就是查询参数,如def cookie(cookie_test:Optional[str]=None)。通过在Postman的Headers中添加Cookie在这里插入图片描述
  • header参数:from fastapi import Header 定义请求类型 def header(header_test:Optional[str]=Header(None, convert_underscores=True)) ,convert_underscores是否转换下划线,为true会把 user_agent转换为user-agent,因为有些http代理或服务器不允许请求头中有_

工程化

建立工程文件夹,并在其中放置init test/__init__.py,引入文件夹中的各个应用

from .mapp01 import app01
# mapp01.py
from fastapi import APIRouter
app01 = APIRouter()

pydantic定义

pydantic可用于fastapi的数据规范,通过BaseModel定义

  • 定义选填: 参数名称:Optional[参数类型]=参数默认值

默认值与可选参数的区别
limit: int = None是将None以int形式赋值给limit,可能会报错
limit: Optional[int] = None是将默认值设置为 None 来声明可选查询参数

  • 传递参数可以直接传递pydantic模型类
  • 函数前面加async可以把接口转为异步
from pydantic import BaseModel,Filed
from typing import Optional,List
from enum import Enum
from datetime import date

class gender(str, Enum):
	man = '男人'
	women = '女人'

class Person(BaseModel):
    name: str = "abc"  # 字符串类型,默认值是abc
    b:bool   # 必须传值,可以是true或false。yes、on、1等返回true
    c:Optional[int]=None   # 或者c:Optional[int] 默认也是None 
    d:gender
    e:List[str]
    f:str = Field(...,example="填写示例,值不会被验证")
    g:int = Field(default=800,title="数字验证示例",description="参数校验,作用等同于fastapi中的Path和Query,可点进去看源码",ge=800)
    h:date   # fastapi官网或pydantic官网可以找到额外的数据类型,uuid等
    class Config:
    	schema_extra = {
			"example":{
				"a":true,
				"d":man,
				"f":"填写示例"  ... 省略  # 该实例会在docs中显示
				}
			}
# 请求体可以嵌套
class mutlPerson(BaseModel):
	person:List[Person] = None  # 定义数据格式嵌套的请求体

可以在fastapi定义的def中传入参数(例子:Person) ,接口传入的请求体可以有多个

def my_example(e01:Person,e02:Person)

启动

uvicorn 启动文件名:fastapi实例名 --reload(代码有修改时自动重启)
或者写在启动文件中

import uvicorn
from fastapi import FastAPI
from test import app01,app02    # 因为test中有init文件
app = FastAPI()
app.include_router(app01, prefix='/mapp01', tags=['应用的标题,在docs中显示'])
app.include_router(app02, prefix='/mapp02')
if __name__ == '__main__':
    uvicorn.run('run:app', host='0.0.0.0', port=8001,
                reload=True, debug=True, workers=1)

该文件是run.py文件,实例化的是app=FastAPI(),所以是run:app

注意

在pydantic定义请求体中数据校验用Field类
路径参数中校验用Path
查询参数中校验用Query

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值