FastAPI 新手入门第 9 篇:配置不要写死在代码里

📅 2026/7/6 3:54:10
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/