Flask 配置文件的核心是让应用在不同环境(开发、测试、生产)下读取正确的参数,最推荐的做法是用配置类管理默认值,再用环境变量覆盖敏感信息。 很多初学者把配置直接写死在代码里,结果上线后改一个数据库地址就要重新发版,既慢又不安全,下面从环境变量、config.py 区别、生产优化、系统差异几个角度,把 Flask 配置文件的常见用法讲透。
Flask 配置文件怎么设置环境变量?从零到生产的完整路径
为什么环境变量比硬编码更安全
硬编码就是把 SECRET_KEY、数据库密码直接写在 app.py 里,一旦代码提交到 Git,密钥就泄露了,环境变量把敏感信息存在操作系统层面,代码仓库里只保留读取逻辑,据 OWASP 建议,敏感配置应避免出现在源码和版本控制中。
Flask 提供了 from_prefixed_env() 方法,它会读取以 FLASK_ 开头的环境变量,并自动转换类型,比如设置 FLASK_DEBUG=1,Flask 会把它识别为布尔值 True,操作路径如下:
- 在终端执行
export FLASK_DEBUG=1(Linux/macOS)或set FLASK_DEBUG=1(Windows CMD)。 - 在代码中调用
app.config.from_prefixed_env()。 - 启动应用后,
app.config['DEBUG']就会变成True。
三种主流加载方式对比
Flask 配置文件加载方式不止一种,选择取决于场景,下表列出常见方法:
| 加载方式 | 方法 | 适用场景 |
|---|---|---|
| 从对象加载 | app.config.from_object() |
多环境配置类,推荐 |
| 从文件加载 | app.config.from_pyfile() |
简单项目,快速上手 |
| 从环境变量加载 | app.config.from_prefixed_env() |
生产环境,容器部署 |
| 从映射加载 | app.config.from_mapping() |
测试时临时覆盖 |
| 从 JSON 加载 | app.config.from_json() |
前后端分离,配置共享 |
多数情况下,项目会混合使用:用 from_object() 加载默认配置类,再用 from_prefixed_env() 覆盖敏感项,这样既保留了代码可读性,又满足了安全要求。
一个最小可运行示例
创建 config.py:
import os
class Config:
SECRET_KEY = os.environ.get('SECRET_KEY', 'dev-key')
DATABASE_URL = os.environ.get('DATABASE_URL', 'sqlite:///app.db')
DEBUG = False
class DevelopmentConfig(Config):
DEBUG = True
class ProductionConfig(Config):
DEBUG = False

在 app.py 中:
from flask import Flask
from config import DevelopmentConfig, ProductionConfig
import os
app = Flask(__name__)
env = os.environ.get('APP_ENV', 'development')
if env == 'production':
app.config.from_object(ProductionConfig)
else:
app.config.from_object(DevelopmentConfig)
app.config.from_prefixed_env()
这套写法在开发机上用默认值,上线时通过环境变量注入真实密钥,不需要改代码。
Flask 配置文件与 config.py 有什么区别?实例文件夹和配置类的真实关系
config.py 只是载体,配置对象才是核心
很多人以为 config.py Flask 配置文件,其实它只是一个普通的 Python 模块,Flask 真正读取的是 app.config 这个字典对象。config.py 里的类或变量,只是被 from_object() 方法加载进 app.config 而已,换句话说,你可以把配置放在 YAML、JSON、甚至数据库里,只要最终加载到 app.config 就行。
实例文件夹的优先级为什么更高
Flask 有一个实例文件夹(instance folder)的概念,它的路径通常是 instance/,不纳入版本控制,你可以在里面放 config.py,然后调用 app.config.from_pyfile('config.py', silent=True),这个文件里的配置会覆盖之前加载的同名配置项。
优先级顺序从低到高:
- Flask 默认配置
- 项目根目录的
config.py - 实例文件夹中的
config.py - 环境变量
- 代码中直接赋值
app.config['KEY'] = value
行业共识认为,敏感信息应放在实例文件夹或环境变量中,而不是提交到 Git,这样做的好处是,本地开发可以用实例文件夹覆盖,生产环境则用环境变量注入,互不干扰。
常见误区:修改配置后不生效
如果你修改了 config.py,但应用没有变化,通常是加载顺序问题,后加载的配置会覆盖先加载的,检查你的代码,确保 from_object() 之后没有再次用 from_pyfile() 把旧值读回来。DEBUG 和 TESTING 这类布尔值,环境变量里写 False 字符串,Flask 可能会解析成 True,因为非空字符串在 Python 中为真,正确做法是写 FLASK_DEBUG=0 或使用

from_prefixed_env() 的类型转换。
Flask 配置文件生产环境怎么优化?国内服务器部署的五个实操步骤
使用 gunicorn 注入环境变量
生产环境不要用 flask run,用 gunicorn 或 uWSGI 启动,以 gunicorn 为例:
export SECRET_KEY='your-real-secret' export DATABASE_URL='postgresql://user:pass@localhost/db' gunicorn -w 4 -b 0.0.0.0:8000 app:app
环境变量在启动命令前设置,gunicorn 会把它们传给 Flask 进程,如果使用 systemd,可以在 service 文件中写 EnvironmentFile=/etc/myapp.env,把敏感变量集中管理。
分离开发、测试、生产配置
不要用同一个配置类跑所有环境,推荐三个类:DevelopmentConfig、TestingConfig、ProductionConfig,生产类里设置 DEBUG = False,并强制要求 SECRET_KEY 从环境变量读取,没有就抛异常。
class ProductionConfig(Config):
DEBUG = False
SECRET_KEY = os.environ['SECRET_KEY'] # 没有就报错
这样部署时如果忘记设置密钥,应用会直接启动失败,而不是带着默认密钥运行。
敏感信息与 .env 文件
本地开发不想每次手动 export,可以用 python-dotenv,安装后在项目根目录创建 .env:
SECRET_KEY=local-dev-key
DATABASE_URL=sqlite:///dev.db
然后在 app.py 顶部调用 load_dotenv(),Flask 会自动读取 .env 中的变量,记得把 .env 加入 .gitignore,不要提交。
免费方案:python-dotenv 零成本管理
对于个人项目或小团队,python-dotenv 加环境变量是最省钱的方案,不需要购买配置中心,也不需要额外服务,运维成本几乎为零,业内专家指出,12-Factor App 原则推荐将配置存储在环境中,这一做法在容器化部署中尤为普遍。
国内服务器注意事项
国内云服务器通常提供环境变量设置界面,在购买页面或控制台里,可以预设 SECRET_KEY 和 DATABASE_URL,这样重启实例后配置依然存在,注意编码问题:Windows 服务器默认 GBK,Linux 默认 UTF-8,配置文件里如果有中文注释,建议统一保存为 UTF-8。
Flask 配置文件在 Windows 和 Linux 下的差异:路径、环境变量与权限
Windows 下的 set 与 PowerShell
Windows CMD 用 set FLASK_DEBUG=1,PowerShell 用

$env:FLASK_DEBUG=1,临时设置只对当前终端有效,要永久生效,得通过“系统属性-高级-环境变量”添加,路径分隔符用反斜杠,但在 Python 字符串里最好用正斜杠或 os.path.join。
Linux 下的 export 与 systemd
Linux 用 export FLASK_DEBUG=1,写入 ~/.bashrc 可持久化,生产环境用 systemd 管理进程时,可以在 /etc/systemd/system/myapp.service 中写:
[Service]
Environment=SECRET_KEY=xxx
Environment=DATABASE_URL=xxx
或者用 EnvironmentFile 指定一个文件,权限方面,.env 文件建议设置 chmod 600,只允许当前用户读写。
路径与实例文件夹的跨平台处理
实例文件夹路径可以用 app.instance_path 获取,Flask 会自动处理不同操作系统的路径分隔符,如果你手动拼接路径,用 pathlib.Path 比字符串拼接更可靠。
from pathlib import Path instance_config = Path(app.instance_path) / 'config.py'
这样在 Windows 和 Linux 下都能正确找到文件。
Flask 配置文件常见问题答疑
Flask 配置文件应该放在项目哪个目录?
推荐放在项目根目录,命名为 config.py,敏感覆盖项放在 instance/config.py,实例文件夹不会被 Git 跟踪,适合存放数据库密码和密钥,如果项目使用包结构,也可以放在包内,但要注意导入路径。
Flask 配置文件修改后需要重启服务吗?
需要,Flask 在启动时读取配置,运行中修改文件不会自动生效,开发模式下开启 debug=True 会自动重载,但生产环境必须重启 gunicorn 或 systemd 服务,重启命令通常是 sudo systemctl restart myapp 或 gunicorn 的 HUP 信号。
Flask 配置文件如何支持多环境切换?
最简单的方式是用环境变量 APP_ENV 控制,在代码里判断 os.environ.get('APP_ENV'),然后加载对应的配置类,也可以用工厂函数 create_app(config_name),把配置名作为参数传入,这样测试时可以加载 TestingConfig,生产时加载 ProductionConfig,互不干扰。
掌握 Flask 配置文件的核心逻辑,就是让默认值留在代码里,让敏感信息从环境变量注入,让不同环境各取所需。 按照上面的步骤操作,你的 Flask 应用在开发、测试、生产之间切换时,就不会再出现密钥泄露或配置错乱的问题。
