FastAPI 项目常日利用 .env 文件来配置项目环境变量,这也是推举的做法。同时 FastAPI 框架集成了 pydantic 模块,供应了直接解析 .env 文件以及参数校验的功能,使得利用 .env 来做项目配置变得极为简便。下面让我们一起来试试吧,本文项目构造如下:
项目构造
项目创建后,先在项目根目录下创建一个 .env 文件,并添加几个配置项供接下来考试测验用,内容如下,紧张关注 enableApiDocs 设置即可,我们用它来掌握交互式 API 文档的开和关:

# .env# 默认是忽略大小写的,有供应配置DEBUG=trueenableApiDocs=NoneTITLE="FastAPI"DESCRIPTION="FastAPI 文档明细描述"VERSION="1.0.0.1"
.env 中内容的大小写是可以设置的,默认值是 None,不区分大小写:
大小写设置
2. 从 BaseSettings 派生 AppSettings 子类
BaseSettings 继续自 BaseModel,从 BaseModel 派生后就能轻松利用 pydantic 供应的校验功能了。
类关系图
# setting.pyfrom pydantic import field_validatorfrom pydantic_settings import BaseSettingsfrom typing import Optionalclass AppSettings(BaseSettings): debug: bool = False enableApiDocs=None title: str description: str version: str # Config 内部类,把稳必须是这个类名才会被 pydantic 识别到 # 这样 pydantic 就会按这样的配置去加载配置文件 class Config: env_file = ".env" env_file_encoding = 'utf-8' @field_validator('enableApiDocs') def enable_api_docs_none_check(cls, v: str) -> Optional[str]: if v and v.lower() == 'none': return None return v @field_validator('title') def title_len_check(cls, v: str) -> Optional[str]: if v and len(v) < 7: return 'FastAPI' return v
把稳上面代码中,Config 内部类不是必须的,也可以通过参数直接指定,这样就不用该类了:
app_settings = AppSettings(_env_file=".env", _env_file_encoding="utf-8")
通过 @field_validator('字段') 对指定的字段设置校验。
须要把稳的是:不同版本的校验装饰器用法可能是不一样的,此处用的是 pydantic 2.7.1,校验装饰器是 @field_validator。
.env 中的 enableApiDocs 用于掌握 API 文档是否开启,不过从.env中读取的内容会被当作字符对待,以是须要把字符 'None' 转换成 None,这个可以通过 @field_validator 来实现,如下。
@field_validator('enableApiDocs') def enable_api_docs_none_check(cls, v: str) -> Optional[str]: if v and v.lower() == 'none': return None return v
from fastapi import FastAPIfrom setting import AppSettingsfrom functools import lru_cache# 本文利用内部类 Config 指定配置文件# app_settings = AppSettings()# 但也可以直接指定配置文件,这时就不用写 Config 内部类了# app_settings = AppSettings(_env_file=".env", _env_file_encoding="utf-8")## 实例化 FastAPI,代表当前做事进程app = FastAPI(debug=get_settings().debug, docs_url=get_settings().enableApiDocs, #只关了swagger-ui, redoc仍可用 title=get_settings().title, description=get_settings().description, version=get_settings().version)# 通过 @app.get 装饰器创建一个 API 端点路由@app.get("/")async def root(): return {"message": "Hello World"}# 带路径参数的 API 要求@app.get("/hello/{name}", tags=['新的接口分组'], summary="sayHello", description="sayHello 接口功能描述", response_description="接口返回值描述")async def say_hello(name: str): return {"message": f"Hello {name}"}# 代码模块在当前路径直接运行时被实行,而被导入时则不会实行if __name__ == "__main__": import uvicorn uvicorn.run(app='main:app', host="127.0.0.1", port=8000, reload=True)
运行效果如下,可以看到和预期的一样,swagger ui 被关闭,redoc 仍可用。
只关了 swagger-ui 的情形
要想同时关闭 swagger-ui 和 redoc,只需按如下修正即可:
app = FastAPI(debug=get_settings().debug, # docs_url=get_settings().enableApiDocs, openapi_url=get_settings().enableApiDocs, title=get_settings().title, description=get_settings().description, version=get_settings().version)
再次运行,可以看到两者均被关闭了,效果如下:
同时关闭 redoc 和 swagger-ui
这样往后想要开启和关闭,只需修正 .env 中的配置即可,不用修正源代码啦。