在开发 Flask 应用时,我们常常需要处理不同的配置需求。比如:
- 开发环境中需要开启调试模式(DEBUG=True),而生产环境需要关闭;
- 开发时用 SQLite 数据库,生产时可能用 MySQL 或 PostgreSQL;
- 像密钥(SECRET_KEY)、数据库密码等敏感信息,直接写在代码里很不安全。
这时候,配置文件和环境变量就能帮我们很好地管理这些配置,让代码更灵活、更安全。
一、配置文件:集中管理非敏感配置¶
1. 创建配置文件¶
最常用的方式是创建一个 Python 文件(比如 config.py)来定义不同环境的配置。我们可以用类来区分不同环境的配置:
# config.py
import os
class BaseConfig:
"""基础配置,所有环境通用"""
SECRET_KEY = 'dev' # 开发环境临时密钥(生产需换用环境变量)
DEBUG = False
SQLALCHEMY_DATABASE_URI = 'sqlite:///dev.db' # 默认本地数据库路径
class DevelopmentConfig(BaseConfig):
"""开发环境配置"""
DEBUG = True # 开启调试模式
# 开发环境数据库配置(可简化)
class ProductionConfig(BaseConfig):
"""生产环境配置"""
DEBUG = False # 关闭调试模式
# 生产环境用 PostgreSQL 示例(需确保数据库连接正确)
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or 'postgresql://user:pass@localhost/prod.db'
2. 在 Flask 应用中加载配置文件¶
在主应用文件(比如 app.py)中,通过 from_object 方法加载对应的配置类:
# app.py
from flask import Flask
from config import DevelopmentConfig, ProductionConfig
import os
# 根据环境变量选择配置(默认开发环境)
env = os.environ.get('FLASK_ENV', 'development')
app = Flask(__name__)
# 加载配置(根据环境变量决定用哪个配置类)
if env == 'development':
app.config.from_object(DevelopmentConfig)
elif env == 'production':
app.config.from_object(ProductionConfig)
else:
app.config.from_object(BaseConfig) # 兜底
@app.route('/')
def hello():
return f"当前环境:{env},调试模式:{app.config['DEBUG']}"
if __name__ == '__main__':
app.run()
二、环境变量:安全管理敏感配置¶
环境变量是系统级别的变量,适合存放密钥、密码等敏感信息,不会直接暴露在代码中。
1. 设置环境变量¶
Linux/Mac 终端(临时设置):¶
# 设置环境类型和密钥(仅当前终端有效)
export FLASK_ENV=development
export SECRET_KEY=your_secure_secret_key
# 查看已设置的环境变量
echo $FLASK_ENV # 输出 development
echo $SECRET_KEY # 输出 your_secure_secret_key
Windows CMD(临时设置):¶
# 设置环境变量
set FLASK_ENV=development
set SECRET_KEY=your_secure_secret_key
# 查看环境变量
echo %FLASK_ENV% # 输出 development
echo %SECRET_KEY% # 输出 your_secure_secret_key
2. 在 Flask 中读取环境变量¶
通过 os.environ.get() 读取环境变量(需先导入 os):
# app.py(修改密钥配置)
from flask import Flask
from config import DevelopmentConfig, ProductionConfig
import os
# 从环境变量读取 SECRET_KEY(无则用默认值)
app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY', 'dev')
# 根据环境变量选择配置
env = os.environ.get('FLASK_ENV', 'development')
if env == 'development':
app.config.from_object(DevelopmentConfig)
elif env == 'production':
app.config.from_object(ProductionConfig)
else:
app.config.from_object(BaseConfig)
@app.route('/')
def hello():
return f"密钥:{app.config['SECRET_KEY']}"
if __name__ == '__main__':
app.run()
三、开发时更便捷:用 .env 文件管理环境变量¶
手动设置系统环境变量比较麻烦,开发时可以用 .env 文件配合 python-dotenv 库自动加载环境变量,避免频繁操作终端。
1. 安装 python-dotenv¶
pip install python-dotenv
2. 创建 .env 文件¶
在项目根目录新建 .env 文件,写入:
FLASK_ENV=development
SECRET_KEY=your_dev_secret_key
DATABASE_URL=sqlite:///dev.db
3. 在代码中加载 .env 文件¶
在 app.py 开头添加:
from dotenv import load_dotenv
import os
# 加载 .env 文件到环境变量(需放在 os.environ.get 之前)
load_dotenv() # 自动读取 .env 文件中的变量
# 现在可以直接读取环境变量
app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY')
env = os.environ.get('FLASK_ENV', 'development')
这样开发时,直接修改 .env 文件即可,无需频繁操作终端,也不会把敏感信息提交到版本控制(记得把 .env 加到 .gitignore 中)。
四、配置优先级与最佳实践¶
-
优先级:环境变量 > 配置文件
如果同时在.env和配置文件中设置了同一个变量(比如SECRET_KEY),环境变量会覆盖配置文件中的值。 -
不同环境分离:
- 开发环境:用.env设置FLASK_ENV=development,开启DEBUG,用 SQLite。
- 生产环境:服务器环境变量设置FLASK_ENV=production,关闭DEBUG,用环境变量设置数据库连接。 -
敏感信息必用环境变量:
密钥、数据库密码等绝对不能写在配置文件中,必须通过环境变量或.env文件设置。
总结¶
- 配置文件适合管理通用配置(如默认数据库路径、基础密钥)。
- 环境变量适合管理敏感信息(如密钥、密码)和动态环境配置(如生产/开发环境切换)。
- .env 文件 + python-dotenv 能让开发更便捷,避免手动设置系统环境变量。
通过合理使用配置文件和环境变量,你的 Flask 应用会更灵活、更安全,也更容易在不同环境中部署!