FastAPI做项目的后端准备

发布时间:2026/7/24 23:31:17
FastAPI做项目的后端准备 FastAPI做项目的后端准备文章目录FastAPI做项目的后端准备前言一、理解框架之间的关系二、Main里面的配置定义 lifespan 生命周期函数1. 引入必要的库代码说明2. 多环境配置依赖相关文件一览三个环境对照表配置实现步骤1. 创建配置文件2. 创建环境文件4. 更新 database.py 使用配置5. 更新 main.py 使用配置配置验证3. 解决 Tortoise-ORM 警告Module app.models has no models问题分析解决方案方案一创建模型文件完整启动流程验证前言搭建项目框架首先明确框架里面的内容boss-api/├── main.py# FastAPI应用主入口│ ├── requirements.txt# Python依赖包│ └── app/# 应用核心代码├── __init__.py │ │ ├── models/# 数据模型层 (Tortoise ORM)│ ├── __init__.py │ ├── user.py# 用户相关模型│ ├── apis/# API路由层[接受参数,返回数据]│ ├── __init__.py │ └── user_api.py# 用户相关API│ └── schemas/# 数据验证层 (Pydantic)│ ├── __init__.py │ └── user.py# 用户请求/响应模型│ │ ├── services/# 业务服务层 (逻辑)│ ├── __init__.py │ ├── user.py# 用户相关的业务代码/方法│ │ ├── core/# 核心文件│ ├── __init__.py │ ├── database.py# 数据库连接信息├── config/# 配置文件│ ├── __init__.py │ ├── settings.py# 多环境配置提示以下是本篇文章正文内容下面案例可供参考一、理解框架之间的关系database:数据库配置文件这个文件定义了Tortoise-ORM 连接MYSQL 数据库所需的所有配置信息二、Main里面的配置定义 lifespan 生命周期函数1. 引入必要的库首先我们需要导入 FastAPI、Tortoise-ORM 以及异步上下文管理器fromfastapiimportFastAPIfromtortoiseimportTortoisefromcontextlibimportasynccontextmanager# 数据库配置示例TORTOISE_ORM{connections:{default:mysql://user:passwordlocalhost:3306/mydatabase},apps:{models:{models:[app.models,aerich.models],default_connection:default,}},use_tz:False,timezone:UTC,}## 2. 实现 lifespan 生命周期函数下面是使用 asynccontextmanager 装饰器定义 lifespan 函数的完整示例 pythonasynccontextmanagerasyncdeflifespan(app:FastAPI): 使用 lifespan 管理应用的生命周期。 在应用启动时初始化数据库连接在应用关闭时释放连接。 这是 FastAPI 推荐的最佳实践。 # 启动时执行的代码print( 正在初始化 Tortoise-ORM...)# 启动阶段初始化 Tortoise-ORM 连接awaitTortoise.init(configTORTOISE_ORM)# 生成数据库表仅开发环境使用# await Tortoise.generate_schemas()print(✅ 数据库连接初始化完成)yield# 应用运行阶段# 关闭阶段销毁数据库连接print( 正在关闭数据库连接...)awaitTortoise.close_connections()print(✅ 数据库连接已关闭)# 创建 FastAPI 应用并传入 lifespanappFastAPI(titleBoss API,description一个使用 FastAPI 和 Tortoise-ORM 的后端项目,version1.0.0,lifespanlifespan# 传入生命周期管理器)# 示例路由app.get(/)asyncdefroot():return{message:欢迎使用 Boss API}app.get(/health)asyncdefhealth_check():return{status:healthy,database:connected}代码说明asynccontextmanager装饰器将异步函数转换为异步上下文管理器lifespan函数启动阶段在yield之前执行用于初始化资源数据库连接运行阶段yield之后应用正常运行关闭阶段yield之后执行用于清理资源关闭数据库连接Tortoise.init()初始化数据库连接Tortoise.close_connections()关闭所有数据库连接app FastAPI(lifespanlifespan)将生命周期管理器传递给 FastAPI 应用启动成功2. 多环境配置依赖pipinstallpydantic-settings项目中已使用pydantic_settings.BaseSettings。相关文件一览项目根目录/ ├── .env# 各环境共享的少量公共项├── .env.dev# 开发环境├── .env.test# 测试环境├── .env.prod# 生产环境真实密钥勿提交公开仓库├── .gitignore# 忽略 .env.dev / .env.prod 等├── main.py# 使用 settings 初始化 FastAPI└── app/ ├── config/ │ └── settings.py# ★ 本节核心└── core/ └── database.py# ★ 从 settings 读库配置三个环境对照表环境英文典型用途调试数据库密钥来源开发dev本机写代码、联调开本地 MySQL.env.dev测试test跑自动化测试、预发验证关测试库可清空.env.test生产prod真实用户访问关生产库环境变量配置实现步骤1. 创建配置文件首先在app/config/settings.py中创建配置类# app/config/settings.pyfrompydantic_settingsimportBaseSettingsfromtypingimportOptionalclassSettings(BaseSettings):应用配置类# 基础配置APP_NAME:strBoss APIAPP_VERSION:str1.0.0DEBUG:boolFalse# 数据库配置DATABASE_URL:strDATABASE_POOL_SIZE:int5DATABASE_MAX_OVERFLOW:int10# JWT配置SECRET_KEY:strALGORITHM:strHS256ACCESS_TOKEN_EXPIRE_MINUTES:int30# 环境特定配置ENVIRONMENT:strdev# dev/test/prodclassConfig:env_file.envenv_file_encodingutf-8case_sensitiveFalse# 创建全局配置实例settingsSettings()2. 创建环境文件在项目根目录创建不同环境的.env文件.env共享配置# 各环境共享的少量公共项 APP_NAMEBoss API APP_VERSION1.0.0 ALGORITHMHS256 ACCESS_TOKEN_EXPIRE_MINUTES30 DATABASE_POOL_SIZE5 DATABASE_MAX_OVERFLOW10.env.dev开发环境# 开发环境配置 ENVIRONMENTdev DEBUGtrue DATABASE_URLmysql://user:passwordlocalhost:3306/boss_dev SECRET_KEYdev-secret-key-change-in-production.env.test测试环境# 测试环境配置 ENVIRONMENTtest DEBUGfalse DATABASE_URLmysql://user:passwordlocalhost:3306/boss_test SECRET_KEYtest-secret-key.env.prod生产环境# 生产环境配置真实密钥勿提交公开仓库 ENVIRONMENTprod DEBUGfalse DATABASE_URL${PROD_DATABASE_URL} # 从环境变量读取 SECRET_KEY${PROD_SECRET_KEY} # 从环境变量读取4. 更新 database.py 使用配置修改app/core/database.py从配置读取数据库连接# app/core/database.pyfromapp.config.settingsimportsettingsdefget_tortoise_config():根据配置生成 Tortoise-ORM 配置return{connections:{default:settings.DATABASE_URL},apps:{models:{models:[app.models,aerich.models],default_connection:default,}},use_tz:False,timezone:UTC,}TORTOISE_ORMget_tortoise_config()5. 更新 main.py 使用配置修改main.py使用配置初始化 FastAPI# main.pyfromfastapiimportFastAPIfromtortoiseimportTortoisefromcontextlibimportasynccontextmanagerfromapp.config.settingsimportsettingsfromapp.core.databaseimportTORTOISE_ORMasynccontextmanagerasyncdeflifespan(app:FastAPI): 使用 lifespan 管理应用的生命周期。 在应用启动时初始化数据库连接在应用关闭时释放连接。 # 启动时执行的代码print(f 正在初始化 Tortoise-ORM... [环境:{settings.ENVIRONMENT}])# 启动阶段初始化 Tortoise-ORM 连接awaitTortoise.init(configTORTOISE_ORM)# 仅在开发环境生成数据库表ifsettings.DEBUG:print( 开发环境生成数据库表...)awaitTortoise.generate_schemas()print(✅ 数据库连接初始化完成)yield# 应用运行阶段# 关闭阶段销毁数据库连接print( 正在关闭数据库连接...)awaitTortoise.close_connections()print(✅ 数据库连接已关闭)# 创建 FastAPI 应用并传入 lifespanappFastAPI(titlesettings.APP_NAME,description一个使用 FastAPI 和 Tortoise-ORM 的后端项目,versionsettings.APP_VERSION,lifespanlifespan,debugsettings.DEBUG,)# 示例路由app.get(/)asyncdefroot():return{message:f欢迎使用{settings.APP_NAME},version:settings.APP_VERSION,environment:settings.ENVIRONMENT,}app.get(/health)asyncdefhealth_check():return{status:healthy,database:connected,environment:settings.ENVIRONMENT,}配置验证创建验证路由检查当前配置# app/apis/config_api.pyfromfastapiimportAPIRouterfromapp.config.settingsimportsettings routerAPIRouter(prefix/config,tags[配置])router.get(/)asyncdefget_config():获取当前配置仅开发环境开放ifnotsettings.DEBUG:return{message:配置信息仅在开发环境可见}return{app_name:settings.APP_NAME,version:settings.APP_VERSION,environment:settings.ENVIRONMENT,debug:settings.DEBUG,database_url:settings.DATABASE_URL[:50]...ifsettings.DATABASE_URLelseNone,}3. 解决 Tortoise-ORM 警告Module “app.models” has no models从启动日志中可以看到以下警告/Users/baimu/PycharmProjects/2603-p3/my/my-boss-fastApiProject/venv/lib/python3.12/site-packages/tortoise/apps.py:42: RuntimeWarning: Module app.models has no models self._load_from_config()问题分析这个警告表示 Tortoise-ORM 在app.models模块中没有找到任何模型定义。在您的TORTOISE_ORM配置中指定了models:[app.models,aerich.models]但app.models模块要么不存在要么存在但没有定义任何 Tortoise 模型类。解决方案方案一创建模型文件创建 models 目录和文件按照项目结构在app/models/目录下创建模型文件# app/models/user.pyfromtortoiseimportfields,modelsclassUser(models.Model):用户模型idfields.IntField(pkTrue)usernamefields.CharField(max_length50,uniqueTrue)emailfields.CharField(max_length100,uniqueTrue)hashed_passwordfields.CharField(max_length128)is_activefields.BooleanField(defaultTrue)created_atfields.DatetimeField(auto_now_addTrue)updated_atfields.DatetimeField(auto_nowTrue)classMeta:tableusersdef__str__(self):returnself.username创建init.py 文件在app/models/__init__.py中导入模型# app/models/__init__.pyfrom.userimportUser __all__[User]完整启动流程验证修复后重新启动应用应该看到正常的启动日志INFO: Willwatchforchangesinthese directories:[/path/to/your/project]INFO: Uvicorn running on http://127.0.0.1:8000(Press CTRLC to quit)INFO: Started reloader process[17071]using WatchFiles 正在初始化 Tortoise-ORM... INFO: Started server process[17073]INFO: Waitingforapplication startup. ✅ 数据库连接初始化完成 INFO: Application startup complete.