Skip to content
本页目录

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在线海产品查询功能

海鲜信息表

image-20230813145341166

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)