新手必备:Flask配置文件与环境变量设置

在开发 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 中)。

四、配置优先级与最佳实践

  1. 优先级:环境变量 > 配置文件
    如果同时在 .env 和配置文件中设置了同一个变量(比如 SECRET_KEY),环境变量会覆盖配置文件中的值。

  2. 不同环境分离
    - 开发环境:用 .env 设置 FLASK_ENV=development,开启 DEBUG,用 SQLite。
    - 生产环境:服务器环境变量设置 FLASK_ENV=production,关闭 DEBUG,用环境变量设置数据库连接。

  3. 敏感信息必用环境变量
    密钥、数据库密码等绝对不能写在配置文件中,必须通过环境变量或 .env 文件设置。

总结

  • 配置文件适合管理通用配置(如默认数据库路径、基础密钥)。
  • 环境变量适合管理敏感信息(如密钥、密码)和动态环境配置(如生产/开发环境切换)。
  • .env 文件 + python-dotenv 能让开发更便捷,避免手动设置系统环境变量。

通过合理使用配置文件和环境变量,你的 Flask 应用会更灵活、更安全,也更容易在不同环境中部署!

小夜