文章目录
框架介绍
- 现代、高性能的python web服务框架,用于构建API;
- 基于异步IO实现并发,性能接近node.js、go;
- 基于starlette异步web框架,使用pydantic实现数据验证、数据过滤、数据序列化等;
- 使用uvicorn (ASGI)异步服务网关,支持高并发;
- 类型提示,提升开发效率、IDE的信息提示;
- 自动生成API文档,内置Swagger UI 、ReDoc
- 使用sqlalchemy 实现ORM的数据库操作;

创建虚拟环境
为了避免多个项目的依赖版本冲突,最好为每个项目单独创建一个虚拟环境,且不影响系统环境;
python方式:
bash
# 创建环境
python -m venv fastapi_env
cd fastapi_env/Scripts/
# 激活环境
activate
# 取消激活
deactivate
如下虚拟环境已激活:

anaconda方式(需要安装anaconda)
bash
conda create -n fastapi_env
conda activate fastapi_env
conda deactivate
在python的虚拟环境中就可以安装要使用的包;
bash
(fastapi_env) >pip install fastapi uvicorn
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple/
Collecting fastapi
第一个案例
- 创建一个目录,使用pycharm打开并配置虚拟环境

- 创建目录结构

python
# app.py
# __author__ = "laufing"
from fastapi import FastAPI
app = FastAPI()
# 注册路由
@app.get("/")
def index():
return "hello world"
@app.get("/info")
def info():
return {
"code": 200,
"message": "ok"
}
if __name__ == '__main__':
# python脚本方式运行服务
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=5050)
# 开启reload模式
# uvicorn.run("app.app:app", host="0.0.0.0", port=5050, reload=True, reload_dirs=[".", "../"])
# uvicorn命令行方式启动服务,通过PYTHONPATH搜索app
#(fastapi_env) C:\Desktop\lauf>uvicorn app.app:app --host localhost --port 5050 --reload
浏览器中访问接口:

请求数据解析
python
# __author__ = "laufing"
from fastapi import FastAPI
app = FastAPI()
# 注册路由
@app.get("/")
def index():
return "hello world"
@app.get("/info")
def info():
return {
"code": 200,
"message": "ok"
}
from fastapi import Query
# 查询参数解析
@app.get("/user/users/")
def get_users(num: int = Query(), page: int = Query(default=None, alias="pageSize", ge=0, lt=10000, description="页码")):
# num, page 均从从Query查询参数中解析, pageSize参数路径地址中的别名
# min_length/max_length
# regex = r"^1[a-z]$"
return {
"code": 200,
"page": page
}
from fastapi import Request
from pydantic import BaseModel, Field
from typing import Any
class UserSchema(BaseModel):
name: str
pwd: str
# 请求体数据的解析
@app.post("/user/users/")
def create_user(user: UserSchema): # pydantic类从请求体中解析数据
return {
"code": 200,
"data": user
}
from enum import Enum
class UserIdEnum(Enum):
A = "a"
B = "b"
C = "c"
# 路径参数解析
@app.get("/user/{user_id}/")
def get_user(user_id: UserIdEnum): # 从路径中匹配出user_id,根据类型注释转为int
# 路径参数验证使用Path 或者枚举类
return {
"code": 200,
"msg": user_id
}
# 自定义验证方法 (实现复杂的验证逻辑)
def validate(value: str):
if not value.startswith("lauf"):
raise ValueError("数据格式不符合要求")
return value
from typing_extensions import Annotated
from pydantic import BeforeValidator # 在验证器之前执行
# 创建一个字符串的类
Info = Annotated[str, BeforeValidator(validate)]
@app.get("/user/info/{info}")
def info(info: Info):
return {
"code": 200,
"data": info
}
if __name__ == '__main__':
# python脚本方式运行服务
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=5050)
# 开启reload模式
# uvicorn.run("app.app:app", host="0.0.0.0", port=5050, reload=True, reload_dirs=[".", "../"])
pydantic的数据验证
- Field 自带的参数验证;
- field_validator 验证装饰器,用于自定义验证逻辑
python
from pydantic import BaseModel, Field, field_validator
from typing import Any
class UserSchema(BaseModel):
name: str = Field(..., min_length=3, max_length=10, description="用户名", example="jack")
pwd: str = Field(..., pattern=r"[a-zA-Z0-9]", title="密码") # 正则验证
email: str
# 自定义验证函数
@field_validator("email")
def my_validator(cls, v):
# cls 是UserSchema类
# v 是邮箱字符串
if "@" not in v:
raise ValueError("自定义:邮箱格式不合格")
return v
# 请求体数据的解析
@app.post("/user/users/")
def create_user(user: UserSchema): # pydantic类从请求体中解析数据
return {
"code": 200,
"data": user
}