准备接口
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