FastAPI的初步学习—Day01
2026/7/22 13:58:28 网站建设 项目流程

一、FastAPI的请求体与HTTP方法

1、请求体

定义:HTTP 请求的「正文部分」,专门用于传递大量、复杂、结构化数据(如 JSON、表单数据。
优势:比普通的路径参数和查询参数简洁高效,传输数据容量大,格式灵活,更加安全。
核心依赖:pip install pydantic 导入依赖中的BaseModel方法:from pydantic import BaseModel
模型示例:

fromtortoiseimportfieldsfromtortoise.modelsimportModelclassUser(Model):id=fields.IntField(pk=True)name=fields.CharField(max_length=20)age=fields.IntField()email=fields.CharField(max_length=50)phone=fields.CharField(max_length=11,null=True,blank=True)classMeta:table="user"# 指定表名def__str__(self):returnself.name

2、HTTP方法

get方法:查询资源(禁止使用请求体)
post方法:创建资源(必用请求体)
put方法修改资源(必用请求体)
patch方法更新部分资源(必用请求体)

二、Tortoise-ORM集成(1)

1、什么是ORM

定义:ORM全称为Object-Relational Mapping(对象关系映射,它的核心思想是:用 Python 类来代表数据库中的表,用类的实例来代表表中的一行记录。

2、ORM的优势

面向对象:用 Python 代码替代 SQL 语句,更符合编程思维。
安全性:自动进行参数化查询,防止 SQL 注入攻击。
跨数据库:同一套代码可以无缝切换 SQLite、PostgreSQL、MySQL 等数据库。
关系管理:自动处理表与表之间的外键、多对多等关系。
可维护性:表结构集中定义在模型类中,修改和管理更方便。

3、Tortoise-ORM的特点

原生异步:基于 asyncio 构建,所有数据库操作都是异步的,不会阻塞事件循环。
Django 风格的 API:如果你用过 Django ORM,会发现语法非常熟悉,上手极快。
轻量级:专注于核心功能,没有冗余的抽象层,性能出色。
完整的关系支持:支持外键、一对一、多对多等所有常见关系类型。
内置 Pydantic 集成:可以通过 pydantic_model_creator 自动从 Tortoise 模型生成 Pydantic 模型,无缝对接 FastAPI 的请求/响应校验。

4、Tortoise-ORM环境配置

核心依赖:pip install tortoise-orm
MySQL 异步驱动:pip install asyncmy(推荐) 或者 pip install aiomysql
Aerich 迁移工具:pip install aerich
FastAPI 和 Uvicorn:pip install fastapi “uvicorn[standard]”

5、FastAPI配置以及跨域

数据库配置:config.py

# app/config.py""" 数据库配置文件 这个文件定义了 Tortoise-ORM 连接 MySQL 数据库所需的所有配置信息 """# TORTOISE_ORM 是 Tortoise-ORM 规定的配置字典变量名# 后面用 register_tortoise 或 Aerich 时都会引用这个字典TORTOISE_ORM={# 1. 连接配置 —— 定义数据库连接信息"connections":{# "default" 是默认连接的名字,必须有一个 default"default":{# engine:指定数据库后端引擎,MySQL 使用 tortoise.backends.mysql"engine":"tortoise.backends.mysql",# credentials:数据库连接凭证,包含主机、端口、用户名、密码等"credentials":{"host":"127.0.0.1",# MySQL 服务器地址"port":3306,# MySQL 端口,默认 3306"user":"root",# 数据库用户名"password":"root",# 数据库密码(请根据实际情况修改)"database":"mysql0719",# 数据库名称"minsize":1,# 连接池最小连接数"maxsize":5,# 连接池最大连接数"charset":"utf8mb4",# 字符集,支持 emoji"echo":True# 是否打印 SQL 语句(开发环境建议开启)}}},# 2. 应用配置 —— 指定模型所在的模块"apps":{# "models" 是应用的名字,可以自定义,但 Aerich 需要使用这个名字"models":{# models 列表:指定包含 Tortoise 模型类的 Python 模块路径# "aerich.models" 是 Aerich 的内置模型,用于记录迁移历史,必须包含"models":["app.models","aerich.models"],# default_connection:指定这个应用使用哪个数据库连接"default_connection":"default",}},# 3. 时区配置"use_tz":False,# 是否使用时区"timezone":"Asia/Shanghai"# 时区设置}

跨域:main.py

fromfastapiimportFastAPIfromtortoise.contrib.fastapiimportregister_tortoisefromapp.routers.user_apiimportuser_routerfromapp.configimportTORTOISE_ORMfromfastapi.middleware.corsimportCORSMiddleware app=FastAPI()register_tortoise(app,config=TORTOISE_ORM,generate_schemas=True,add_exception_handlers=True)app.include_router(user_router)@app.get("/")asyncdefroot():return{"message":"Hello World"}@app.get("/hello/{name}")asyncdefsay_hello(name:str):return{"message":f"Hello{name}"}origins=["http://localhost","http://localhost:8080",# Vue/React前端地址"http://127.0.0.1:3000","http://localhost:5173",# 线上域名 "https://xxx.com"]# 添加跨域中间件app.add_middleware(CORSMiddleware,allow_origins=origins,# 允许的域名allow_credentials=True,# 允许携带cookie、认证头allow_methods=["*"],# 允许所有请求方法 GET/POST/PUT/DELETE...allow_headers=["*"],# 允许所有请求头)

6、Tortoise-ORM 模型定义

fromtortoiseimportfieldsfromtortoise.modelsimportModelclassUser(Model):id=fields.IntField(pk=True)name=fields.CharField(max_length=20)age=fields.IntField()email=fields.CharField(max_length=50)phone=fields.CharField(max_length=11,null=True,blank=True)classMeta:table="user"# 指定表名def__str__(self):returnself.name

7、迁移命令

Aerich 初始化:aerich init -t app.config.TORTOISE_ORM (TORTOISE_ORM为数据库配置文件config.py中定义的数据库链接)
初始化数据库(创建初始迁移):aerich init-db
(以上两条命令是第一次迁移时使用的命令)
生成迁移文件:aerich migrate --name add_author_models
运行迁移:aerich upgrade

8、创建并注册路由

创建:在user文件中使用APIRouter方法创建路由

fromfastapiimportAPIRouter user_router=APIRouter(prefix="/user",tags=["用户管理"])

注册:在main.py中使用include_router方法注册路由。

fromapp.routers.user_apiimportuser_router app.include_router(user_router)

9、HTTP方法的使用以及代码

模型定义schemas/user.py

frompydanticimportBaseModel,FieldclassUserCreate(BaseModel):name:str=Field(...,description="用户名",max_length=20,min_length=2)age:str=Field(...,description="年龄")email:str=Field(...,description="邮箱",pattern="^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$")phone:str=Field(None,description="手机号",max_length=11,min_length=11,pattern="^\d{11}$")classUserUpdate(BaseModel):name:str=Field(None,description="用户名",max_length=20,min_length=2)age:str=Field(None,description="年龄")email:str=Field(None,description="邮箱",pattern="^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$")phone:str=Field(None,description="手机号",max_length=11,min_length=11,pattern="^\d{11}$")

接口代码routers/uer.py

fromfastapiimportAPIRouterfromapp.models.userimportUserfromapp.schemas.userimportUserCreate,UserUpdate user_router=APIRouter(prefix="/user",tags=["用户管理"])@user_router.get("/all",summary="查询所有用户",description="查询所有用户信息")asyncdefuserall():user=awaitUser.all()return{"msg":"查询成功","data":user,"code":200}@user_router.get("/all/{id}",summary="查询用户",description="根据ID查询用户")asyncdefuserone(id:int):user=awaitUser.get(id=id)return{"msg":"查询成功","data":user,"code":200}@user_router.post("/add",summary="添加用户",description="添加用户")asyncdefuseradd(user:UserCreate):user_add=user.dict()awaitUser.create(**user_add)return{"msg":"添加成功","data":user,"code":200}@user_router.delete("/delete/{id}",summary="删除用户",description="根据ID删除用户")asyncdefuserdelete(id:int):user=awaitUser.get(id=id)awaituser.delete()return{"msg":"删除成功","code":200}@user_router.put("/update/{id}",summary="更新用户",description="根据ID更新用户")asyncdefuserupdate(id:int,user:UserUpdate):user_update=user.dict(exclude_unset=True)awaitUser.filter(id=id).update(**user_update)return{"msg":"更新成功","data":user,"code":200}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询