FastApi
FastApi 总结
前言&依赖
官方文档:https://fastapi.org.cn/learn/
在编写路由的时候请参考 Api规范
依赖:
1 | |
项目构成
一个完整的项目应有以下配置
1 | |
确保各功能各司其职是完成一个项目的关键,同时模块化处理能够便于项目管理与优化
项目开发时应遵循:
阅读了解 API 规范 → 创建路由 → 根据路由创建pydantic模型(可选) → 确认实现逻辑 → 创建对应的 ORM 模型 → 完成crud操作 → 完善路由 → 在交互式文档或前端页面调用api查看是否正常工作 → 修复bug/投入使用
遇见bug处理方式:
检查是否挂载路由
询问 AI
参考官方文档
搜索相似问题解决方法
主程序入口
主程序通常写在 main.py 文件中,启动程序的方法可以使用命令行
1 | |
也可以在vscode中进行配置(视个人情况而定)
1 | |
一个main.py通常含有以下配置:
lifespan生命周期https://fastapi.org.cn/advanced/events/
app运行实例middleware中间件https://fastapi.org.cn/tutorial/middleware/
include_router挂载的路由
示例:
1 | |
config相关
这是配置文件夹,可以同来配置数据库等基础配置,并将其封装为依赖
https://fastapi.org.cn/reference/dependencies/
数据库我们通常使用也同样具有异步的aiomysql驱动,搭配sqlalchemy使用,在构建依赖前,必须先配置数据库项
DB_URl 该项指定数据库类型和所用的驱动
参考使用:DB_URL = “mysql+aiomysql://username:password@localhost:3306/test?charset=utf8mb4”
engine 构建数据库引擎
参考文档:https://docs.sqlalchemy.org.cn/en/20/orm/extensions/asyncio.html#sqlalchemy.ext.asyncio.create_async_engine
async_session 会话项
用于管理会话,需要绑定引擎
get_db 依赖项
用于构建数据库依赖
示例文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker, AsyncSession
DB_URL = "mysql+aiomysql://username:password@localhost:3306/test?charset=utf8mb4"
engine = create_async_engine(
DB_URL,
echo=True, # 是否返回数据库操作信息
pool_size=10, # 连接池大小
max_overflow=20 # 额外允许的溢出连接数
)
async_session = async_sessionmaker(
bind= engine,
class_= AsyncSession,
expire_on_commit= False
)
# dependence 依赖项
async def get_db():
async with async_session() as session:
try:
yield session
await session.commit()
except Exception as e:
await session.rollback()
raise e
finally:
await session.close()
models相关
该文件夹管理ORM模型类,模型用来映射数据库表,是crud的基础
一个ORM模型类继承于父类 Base,而 Base 类则继承于 DeclarativeBase 类
Base类常用来作为基类,即通用的表列结构,如创建时间和更新时间ORM模型类则具体规定映射表的各项结构
一个ORM模型类必须有对应的表名,即 __tablename__,对于具体的高频查询字段,可以设置额外的索引来提高效率,常定义在 __table_args__,接着通过 Mapped[] 和 mapped_column() 来映射字段
示例文件:
1 | |
routers相关
这个文件夹用来管理路由
一个路由通常包含所有该模块相关的接口,每个路由文件都必须包含一个 router 用来挂载接口
router指的是fastapi中的APIRouter,其中包含的prefix和tags参数非常实用prefix:前缀,用于规范接口tags: 分类标签,用于交互式文档docs的渲染显示,用于区分其他路由,便于调试
参考文档:https://fastapi.org.cn/reference/apirouter/
每个接口的定义应遵循
api文档注意!别忘记在主程序挂载路由
示例文件:
1 | |
schemas相关
schemas内定义着接收的请求类型和响应的数据类型,用于与前端的交互
每个最基础的pydantic类都必须继承于 BaseModel,可以调整设置 ConfigDict() 来调整命名兼容和 从orm对象中获取字段值
样例如下:
1 | |
crud相关
crud内主要是数据库的增删改查操作,主要用途为被 routers 调用
如果一个接口没有正常运行,请优先检验数据库query是否正常被执行
示例:
1 | |
utils相关
该文件夹保存工具类函数,如上文提及的 auth(认证),response(响应)文件,合理利用能够节省大量时间,提高代码复用性和可读性
工具类可以高度自定义,具体情况请按照实际开发为主,常用的工具类可以为:
security: 安全模块,用于加密密码等相关用途response: 响应模块,用于响应数据,封装可提高可读性和复用性exception: 异常捕获模块,用于捕获异常,快速分析问题- 异常可分为
业务层面异常,数据库完整性约束错误,数据库操作错误,其他未定义的异常
- 异常可分为
auth: 认证模块,用于检验用户令牌相关