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.

相关新闻

JavaSE 基础语法 - 方法的使用 - ②

JavaSE 基础语法 - 方法的使用 - ②

接上节 JavaSE 基础语法 - 方法的使用 - ① 的内容。 十一、方法签名 在学习方法重载之前,我们需要先了解一个非常重要的概念——方法签名(Method Signature)。 很多初学者都有这样的疑问: 为什么下面三个方法都叫 sum()&#xff…

2026/7/24 23:31:09阅读更多 →
基于SPN结构的抗量子分组加密算法GiantWhale

基于SPN结构的抗量子分组加密算法GiantWhale

基于SPN结构的抗量子分组加密算法GiantWhale我们知道,量子计算机对RSA和ECC等非对称加密算法的威胁非常大,对AES、ARIA和SM4等对称加密算法的威胁则较小。就目前来说,量子算法对对称加密算法分支之一的分组加密算法有两大威胁:&am…

2026/7/24 23:31:09阅读更多 →
MonkeyCode 多模型调度与云端开发环境解析

MonkeyCode 多模型调度与云端开发环境解析

不同大模型各有所长,让任务决定模型,比让团队绑定单一模型更合理。同时,云端开发环境让“打开浏览器就能验证需求”成为现实。## 一、为什么需要多模型调度| 模型方向 | 更适合的场景 | 特点 ||---|---|---|| 通用推理型 | 需求澄清、方案讨论…

2026/7/24 23:31:09阅读更多 →
御坂翻译器:5分钟快速开启Galgame实时翻译的终极解决方案

御坂翻译器:5分钟快速开启Galgame实时翻译的终极解决方案

御坂翻译器:5分钟快速开启Galgame实时翻译的终极解决方案 【免费下载链接】MisakaTranslator 御坂翻译器—Galgame/文字游戏/漫画多语种实时机翻工具 项目地址: https://gitcode.com/gh_mirrors/mi/MisakaTranslator 你是否曾因为语言障碍而错过精彩的日系视…

2026/7/25 0:53:23阅读更多 →
别再只看Pass@1!:我们用AST语义等价校验+CI流水线实跑验证,重新定义AI编程能力黄金评估标准

别再只看Pass@1!:我们用AST语义等价校验+CI流水线实跑验证,重新定义AI编程能力黄金评估标准

更多请点击: https://intelliparadigm.com 第一章:别再只看Pass1!:我们用AST语义等价校验CI流水线实跑验证,重新定义AI编程能力黄金评估标准 传统Pass1指标仅衡量模型首次生成代码是否通过单元测试,却无视…

2026/7/25 0:53:23阅读更多 →
【独家拆解】头部AI电商团队不愿公开的4层利润结构(含成本/转化/复购真实参数)

【独家拆解】头部AI电商团队不愿公开的4层利润结构(含成本/转化/复购真实参数)

更多请点击: https://intelliparadigm.com 第一章:AI做电商赚钱方法的底层逻辑与行业真相 AI驱动的电商盈利并非依赖“黑科技”或流量玄学,而是建立在数据闭环、用户意图建模与实时决策优化三重基石之上。当前行业普遍存在认知偏差&#xff…

2026/7/25 0:53:23阅读更多 →
开放式耳机性价比高有哪些?2026年十大高性价比开放式耳机推荐

开放式耳机性价比高有哪些?2026年十大高性价比开放式耳机推荐

因为开放式耳机真的好用,但只适合“对的人”。它没有入耳式的闷耳、胀痛,没有头戴式的笨重、闷热,更兼顾了听力友好和场景安全。开放式耳机不用塞进耳道,耳道通畅,不用担心堵耳,不闷不胀,不滋生…

2026/7/25 0:53:23阅读更多 →
高性价比的开放式耳机有哪些?十大公认高性价比的开放式耳机推荐

高性价比的开放式耳机有哪些?十大公认高性价比的开放式耳机推荐

在当下的耳机品类里,开放式耳机无疑占据着极高热度。伴随声学技术不断迭代升级,大众对耳机的使用要求也变得更加精细化,开放式耳机也跳出了过去小众的定位,慢慢成为通勤出行、日常办公以及运动健身场景里的必备数码单品。那么&…

2026/7/25 0:53:23阅读更多 →
Pixso AI功能完整教程:AI生成设计稿、自动布局与团队协作实战

Pixso AI功能完整教程:AI生成设计稿、自动布局与团队协作实战

Pixso 是一款国产在线协同 UI 设计工具,支持网页端直接使用,无需安装。其内置的 AI 设计助手可以自动生成设计稿、填充文案、检查设计规范,大幅提升设计效率。本文按照实际操作流程,详细介绍 Pixso 的核心功能和具体用法。 Pixso…

2026/7/25 0:51:23阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 0:58:53阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 0:58:53阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 0:58:53阅读更多 →
突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决您的…

2026/7/25 0:01:16阅读更多 →
C++ string类模拟实现:从深拷贝到内存管理的完整指南

C++ string类模拟实现:从深拷贝到内存管理的完整指南

1. 项目概述:为什么我们要“手撕”string类?在C的学习道路上,尤其是从C语言过渡到C的“初阶”阶段,string类绝对是一个绕不开的核心。标准库里的std::string用起来太方便了,、find、substr,几个操作符和函数…

2026/7/25 0:01:16阅读更多 →
三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

1. 先搞清楚“三角洲寻宝鼠”到底是什么工具从名称来看,“三角洲寻宝鼠”更像是一个资源查找或文件检索类工具,而不是游戏或娱乐软件。这类工具的核心价值在于帮助用户快速定位特定资源,比如文档、图片、压缩包或特定格式的文件。如果你经常需…

2026/7/25 0:01:16阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/24 23:01:03阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/24 19:00:40阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/24 19:00:40阅读更多 →