FastAPI 新手入门第 9 篇:配置不要写死在代码里
前面几篇我们一直把代码写在项目里接口也能正常跑。但真实项目里总会遇到一类值本地和线上不一样今天和明天也可能不一样。比如应用名称、运行环境、数据库地址。它们不适合写死在代码里。这一篇我们先不接数据库只做一件事把配置放到.env让 FastAPI 启动时读取它。做完后改一下.env里的APP_ENV重启服务/health的响应会跟着变化。先准备 .env在项目根目录新建.envAPP_NAMEFastAPI Beginner Lab APP_ENVdev DATABASE_URLsqlite:///./fastapi_beginner_lab.db这三个值先这样理解APP_NAME应用名称用来显示在/docs页面标题里。APP_ENV当前运行环境比如dev、local、prod。DATABASE_URL数据库地址这一篇先只放着后面接数据库时会用。我还会放一个.env.example到仓库里内容和.env一样。读者拉代码后复制一份Copy-Item.env.example.env.env.example可以提交到 GitHub.env通常不提交。因为.env里后面可能会放数据库密码、密钥这些本机或线上才有的值。安装 pydantic-settingsFastAPI 官方文档推荐用 Pydantic Settings 管理配置。现在我们用的是 Pydantic v2所以需要安装pydantic-settings。项目的pyproject.toml加上这一行dependencies [ fastapi[standard]0.115.0, pydantic-settings2.0.0, ]如果你已经创建了虚拟环境重新安装一次项目依赖python-m pip install-e.这样代码里就可以从pydantic_settings导入BaseSettings。创建 config.py新建app/config.py。这段代码重点看Settings里的三个字段它们和.env里的名字对应。fromfunctoolsimportlru_cachefrompydantic_settingsimportBaseSettings,SettingsConfigDictclassSettings(BaseSettings):app_name:strFastAPI Beginner Labapp_env:strdevdatabase_url:strsqlite:///./fastapi_beginner_lab.dbmodel_configSettingsConfigDict(env_file.env,env_file_encodingutf-8)lru_cachedefget_settings():returnSettings()BaseSettings会从环境变量和.env里读取值。比如.env里有APP_ENVdev它会填到app_env字段里。字段名一个是大写下划线一个是小写下划线Pydantic Settings 会帮我们对应上。lru_cache的作用是缓存配置。没有它每次调用get_settings()都会重新创建一个Settings对象。配置一般启动后不需要每个请求都重新读一遍所以缓存起来更合适。让 /docs 显示应用名称打开app/main.py把FastAPI()改成读取配置fromfastapiimportFastAPIfrom.configimportget_settings settingsget_settings()appFastAPI(titlesettings.app_name)保存后启动服务再打开http://127.0.0.1:8000/docs页面标题会使用.env里的APP_NAME。改一下.envAPP_NAMEMy Local API重启服务/docs的标题也会变。到这里配置已经从代码里移出来了。在 /health 里返回当前环境现在把APP_ENV放到/health响应里。打开app/routers/health.pyfromfastapiimportAPIRouter,Dependsfrom..configimportSettings,get_settings routerAPIRouter(tags[system])router.get(/health,summary查看服务状态)defhealth_check(settings:SettingsDepends(get_settings)):return{status:ok,app_name:settings.app_name,app_env:settings.app_env,}这里用了前面学过的Depends。FastAPI 调用health_check前会先调用get_settings()再把结果传给settings。打开/docs调用GET /health应该能拿到{status:ok,app_name:FastAPI Beginner Lab,app_env:dev}现在把.env里的APP_ENV改成APP_ENVlocal重启服务再调用/health响应里的app_env会变成local。这就是这篇要看到的结果。哪些配置适合放进环境变量我会把“不同环境会变”或者“不适合写进代码仓库”的值放进配置里。常见的有这些数据库地址本地可能是 SQLite线上可能是 PostgreSQL。密钥比如 JWT 密钥不能直接写进代码再推到 GitHub。第三方服务地址测试环境和线上环境通常不同。开关类配置比如是否开启调试日志。普通业务常量不用急着放进去。比如商品默认排序字段、分页默认数量如果项目里很稳定直接写在代码里也没问题。配置不是越多越好。能让环境差异少改代码才是这一步的目的。动手改一下给配置增加一个debug字段classSettings(BaseSettings):app_name:strFastAPI Beginner Labapp_env:strdevdatabase_url:strsqlite:///./fastapi_beginner_lab.dbdebug:boolFalse然后在.env里加DEBUGtrue把/health响应改成return{status:ok,app_name:settings.app_name,app_env:settings.app_env,debug:settings.debug,}重启服务后如果/health里返回debug: true这篇就算学完。到这里这篇的目标已经完成我们用.env保存了应用名称、运行环境和数据库地址。我们用Settings把配置读进 Python 对象。我们在/health里确认改配置后响应会变化。本文代码https://github.com/tanghaojin/fastapi-beginner-lab/tree/article-09-settings下一篇解决另一个问题接数据库前先分清请求模型、响应模型和数据库里的数据长什么样。参考资料FastAPI Environment Variables: https://fastapi.tiangolo.com/environment-variables/FastAPI Settings and Environment Variables: https://fastapi.tiangolo.com/advanced/settings/

相关新闻

优化Java应用性能的五个实战技巧

优化Java应用性能的五个实战技巧

性能优化是工程实践,不是玄学当你盯着VisualVM里那条几乎垂直上升的CPU曲线,或者GC日志里频繁出现的Full GC字样时,总希望有一种能一键解决所有问题的银弹。可惜,Java性能优化从来不是靠某个参数或某个框架就能搞定的。它是一场需…

2026/7/6 3:54:20阅读更多 →
javascript的动态this与动态绑定

javascript的动态this与动态绑定

javascript是一门动态语言,最明显就是那个dynamic this。它一般都是作为函数调用者存在。在javascript,所有关系都可以作为对象的一个关联数组元素而存在。那么函数就是被掰成两部分储存于对象,一是其函数名(键)&#…

2026/7/6 3:54:20阅读更多 →
关于对类和对象的理解

关于对类和对象的理解

关于类的理解 对具有相同特征和作用的对象集合.类定义事物含有的属性和行为,常有于描述对象 关于对象的理解 任何一个具体的事物或者物体是一个对象,是类实例化之后的具体个体 下面是对于类和对象写的一段代码,如有不对之处希望指出 public c…

2026/7/6 3:49:20阅读更多 →
线性回归模型选择:R² 与 Adjusted R² 的3个关键差异与5个实战应用场景

线性回归模型选择:R² 与 Adjusted R² 的3个关键差异与5个实战应用场景

线性回归模型选择:R 与 Adjusted R 的3个关键差异与5个实战应用场景在数据分析的世界里,线性回归模型就像一把瑞士军刀,简单却功能强大。但当我们面对多个预测变量时,如何判断哪个模型才是"最佳"选择?这时&a…

2026/7/6 5:04:25阅读更多 →
XCOM 2模组管理的终极解决方案:Alternative Mod Launcher完全指南

XCOM 2模组管理的终极解决方案:Alternative Mod Launcher完全指南

XCOM 2模组管理的终极解决方案:Alternative Mod Launcher完全指南 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/g…

2026/7/6 5:04:25阅读更多 →
PyFluent架构革新:Python原生接口实现CFD仿真自动化与性能突破

PyFluent架构革新:Python原生接口实现CFD仿真自动化与性能突破

PyFluent架构革新:Python原生接口实现CFD仿真自动化与性能突破 【免费下载链接】pyfluent Pythonic interface to Ansys Fluent 项目地址: https://gitcode.com/gh_mirrors/pyf/pyfluent PyFluent作为Ansys Fluent的Python原生接口,通过架构创新将…

2026/7/6 5:04:25阅读更多 →
Three.js Web3 仪表盘:3D 场景也要有数据可信度

Three.js Web3 仪表盘:3D 场景也要有数据可信度

Three.js Web3 仪表盘:3D 场景也要有数据可信度 一、酷炫不是仪表盘的目标 Three.js 可以把链上数据做成很酷的 3D 仪表盘:流动的交易、发光的节点、立体资产地图。但 Web3 数据天然复杂,用户需要知道数据来源、更新时间、确认数和统计口径。…

2026/7/6 5:04:24阅读更多 →
如何快速解决Cursor试用限制:专业级重置方案指南

如何快速解决Cursor试用限制:专业级重置方案指南

如何快速解决Cursor试用限制:专业级重置方案指南 【免费下载链接】go-cursor-help 解决Cursor在免费订阅期间出现以下提示的问题: Your request has been blocked as our system has detected suspicious activity / Youve reached your trial request limit. / Too…

2026/7/6 5:04:24阅读更多 →
Synology硬盘兼容性终极指南:3分钟解锁第三方硬盘支持

Synology硬盘兼容性终极指南:3分钟解锁第三方硬盘支持

Synology硬盘兼容性终极指南:3分钟解锁第三方硬盘支持 【免费下载链接】Synology_HDD_db Add your HDD, SSD and NVMe drives to your Synologys compatible drive database and a lot more 项目地址: https://gitcode.com/GitHub_Trending/sy/Synology_HDD_db …

2026/7/6 4:59:24阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/6 4:26:20阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/6 2:48:33阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/6 0:10:35阅读更多 →
Seraphine:基于LCU API的英雄联盟智能游戏助手技术解析与应用指南

Seraphine:基于LCU API的英雄联盟智能游戏助手技术解析与应用指南

Seraphine:基于LCU API的英雄联盟智能游戏助手技术解析与应用指南 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine 技术架构先行:官方接口的合规应用 你是否曾在BP阶段手忙脚乱&#x…

2026/7/6 0:03:39阅读更多 →
多协议远程连接管理工具mRemoteNG:告别混乱,统一你的远程桌面管理

多协议远程连接管理工具mRemoteNG:告别混乱,统一你的远程桌面管理

多协议远程连接管理工具mRemoteNG:告别混乱,统一你的远程桌面管理 【免费下载链接】mRemoteNG mRemoteNG is the next generation of mRemote, open source, tabbed, multi-protocol, remote connections manager. 项目地址: https://gitcode.com/gh_m…

2026/7/6 0:03:39阅读更多 →
COUNT(DISTINCT) 与 GROUP BY 去重统计:5 亿数据量下的性能实测与选型指南

COUNT(DISTINCT) 与 GROUP BY 去重统计:5 亿数据量下的性能实测与选型指南

COUNT(DISTINCT) 与 GROUP BY 去重统计:5 亿数据量下的性能实测与选型指南在数据分析和处理领域,去重统计是最基础也是最频繁使用的操作之一。当数据量达到亿级规模时,不同的去重统计方法在性能上可能产生天壤之别。本文将基于 5 亿行数据的实…

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

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

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

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

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

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

2026/7/6 4:45:01阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

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

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

2026/7/6 4:45:03阅读更多 →