Appearance
fastAPI
1.认识FastAPI
1.1 学习代码
1.1.1 Hello World
用接口输出helloworld
python
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get("/")
async def root():
return {"message":"Hello World"}
if __name__ == "__main__"
uvicorn.run(app = app)
2. 认识请求
2.1 学习代码
2.1.1 路径参数
2.1.1.1 简单路径参数
获取get请求接口时候带的路径参数
python
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get("/item/{item_id}") # 注册路由路径 使用{}定义路径参数
async def read_item(item_id):
print(item_id)
return {"item_id":item_id}
if __name__ == "__main__"
uvicorn.run(app = app)
2.1.1.2 有类型的路径参数
获取get请求接口时候带的路径参数 并转换成指定类型
python
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get("/item/{item_id}")
async def read_item(item_id: int): # 带整型 int
print(item_id)
return {"item_id":item_id}
if __name__ == "__main__"
uvicorn.run(app = app)
2.1.1.3 路由访问顺序
注册了两个路由 是按代码写的顺序匹配的 从上往下 匹配成功就不会往下匹配
python
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get("/users/me") # 注册静态路由路径 /users/me
async def read_user_me():
return {"user_id": "the current user"}
@app.get("/users/{user_id}") # 注册路由路径 /users/{user_id}
async def read_user():
return {"user_id": user_id}
if __name__ == "__main__"
uvicorn.run(app = app)
2.1.1.4 使用枚举类型参数
可以对路径参数中接受到的值进行验证,并转换为枚举类型的数据
python
from enum import Enum
from fastapi import FastAPI
import uvicorn
class ModelName(str, Enum) # 定义枚举类 继承 str Enum 作用是为了让API文档解析到这个枚举类中的值类型是str
alexnet = "alexnet"
resnet = "resnet"
letnet = "letnet"
app = FastAPI()
@app.get("/models/{model_name}") # 注册静态路由路径 /users/me
async def get_model(model_name: ModelName):
if model_name == ModelName.alexnet: # 枚举类型比较
return {"model_name":model_name,"message":"深度学习模型精英: alexnet"}
if model_name.value == "letnet": # 使用值比较
return {"model_name":model_name,"message":"深度学习模型元老: letnet"}
if model_name == ModelName.resnet:
return {"model_name":model_name,"message":"深度学习模型新秀: resnet"}
if __name__ == "__main__"
uvicorn.run(app = app)
2.1.2 查询参数
2.1.2.1 标准查询参数
当地址栏输入localhost:8000/items?skip=0&limit=10,skip和limit是查询参数
python
from fastapi import FastAPI
import uvicorn
app = FastAPI()
items = [{"names":"泰迪"},{"names":"科基"},{"names":"加菲"},{"names":"斗牛"},{"names":"英短"}]
@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10): #定义了两个参数 参数类型为 int
return items[skip : skip + limit] # 用数组的语法截取 若skip =0 limit=3 得到 [{"names":"泰迪"},{"names":"科基"},{"names":"加菲"}]
if __name__ == "__main__"
uvicorn.run(app = app)
2.1.2.2 可选查询参数
在有些业务场景中 部分参数是可选 并且不能指定默认值
python
from typing import Optional
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(
item_id: str,
q: Optional[str] = None
):
if q: # 传入可选参数的时候
return {
"item_id": item_id,
"q": q
}
return {
"item_id": item_id
}
if __name__ == "__main__"
uvicorn.run(app = app)
2.1.2.3 必选查询参数
不带默认值 只带类型的查询参数 就是必选查询参数
python
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(
item_id: str, #定义路径参数
q: str #定义查询参数
):
return {
"item_id": item_id,
"q": q
}
if __name__ == "__main__"
uvicorn.run(app = app)
2.1.2.4 参数类型转换
fastapi将参数转换成定义类型
python
from typing import Optional
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(
item_id: str,
q: Optional[str] = None,
short: bool = False
):
item = {"item_id":item_id}
if q: # 传入可选参数的时候
item.update({
"q": q
})
if not short:
item.update({
"description": "这是一个神奇的东西,而且名字很长"
})
else:
item.update({
"short":short
})
return item
if __name__ == "__main__"
uvicorn.run(app = app)
2.1.3 请求体(post请求参数)
2.1.3.1 定义请求体的数据类型
post请求的时候 用请求体向接口传递数据
python
from typing import Optional
from fastapi import FastAPI
import uvicorn
from pydantic import BaseModel #导入基础模型类
class Item(BaseModel): # 定义请求体 数据类型类
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
app = FastAPI()
@app.post("/items/") # 注册路由路径 post请求
async def create_item(item: Item): #定义请求体item
return item
if __name__ == "__main__"
uvicorn.run(app = app)
2.1.3.2 同时使用路径参数,查询参数和请求体
从请求路径 查询字符串 和 请求体中获取请求参数
python
from typing import Optional
from fastapi import FastAPI
import uvicorn
from pydantic import BaseModel #导入基础模型类
class Item(BaseModel): # 定义请求体 数据类型类
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
app = FastAPI()
@app.post("/items/{item_id}") # 注册路由路径 post请求
async def create_item(
item: Item,
item_id: int,
q: Optional[str] = None
): #定义请求体item
result = { # 将路径参数 与请求体 参数合并
"item_id": item_id,
**item.dict()
}
if q:
result.update({"q":q})
return result
if __name__ == "__main__"
uvicorn.run(app = app)
2.1.3.3 可选请求体参数
使用option关键字将请求体参数设置为可选参数
python
from typing import Optional
from fastapi import FastAPI, Path
import uvicorn
from pydantic import BaseModel #导入基础模型类
class Item(BaseModel): # 定义请求体 数据类型类
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
app = FastAPI()
@app.put("/items/{item_id}") # 注册路由路径 post请求
async def update_item(
*, # python语法 表示后面参数都是键值对
item: Optional[Item] = None, # 请求体对象 可选参数
item_id: int = Path(...,title="元素ID",ge=0,le=1000),# 路径参数 类型为int 值大于等于0并且小于等于1000
q: Optional[str] = None
): #定义请求体item
result = { # 将路径参数 与请求体 参数合并
"item_id": item_id,
}
if q:
result.update({"q":q})
if item:
result.update({"item":item})
return result
if __name__ == "__main__"
uvicorn.run(app = app)
2.1.3.4 同时使用多个请求体参数
web后端服务器期望请求体格式是
json
{
"item": {
"name" : "jscs",
"description" : "一段大文本",
"price": 42.0,
"tax": 3.2
},
"user": {
"username": "liuyu",
"full_name": "刘宇"
}
}
对应代码:
python
from typing import Optional
from fastapi import FastAPI
import uvicorn
from pydantic import BaseModel #导入基础模型类
class Item(BaseModel): # 定义请求体 数据类型类
name: str
description: Optional[str] = None
price: float
tax: Optional[float] = None
class User(BaseModel): # 定义请求体 数据类型类
username: str
full_name: Optional[str] = None
app = FastAPI()
@app.put("/items/{items_id}") # 注册路由路径 post请求
async def create_item(
item_id: int,
item: Item,
user: User
): #定义请求体item
result = {
"item_id": item_id,
"item": item,
"user": user,
}
return result
if __name__ == "__main__"
uvicorn.run(app = app)
2.2 业务代码
2.2.1在线海产品查询功能
海鲜信息表
python
from fastapi import FastAPI
import uvicorn
app = FastAPI()
goods_table = {
"小黄鱼": [20,'斤',168],
"鲫鱼": [100,'斤',48],
"草鱼": [200,'斤',69],
"黑鱼": [500,'斤',21],
}
@app.get("/goods/")
async def findGoods(
name: str #定义查询参数
):
return name + ' ' + str(goods_table[name])
if __name__ == "__main__"
uvicorn.run(app = app)