Flask 虽然轻量,但项目一大,配置就杂乱起来了。数据库地址、调试模式、密钥啥的,不想硬编码在代码里,就得搞点配置管理技巧。

这篇主要讲两块:

  • 用环境变量管理敏感配置
  • 用 config 文件(py 或 .env)统一管理多环境配置

一、为什么不能直接写死配置?

  • 安全问题:数据库密码、密钥不能硬编码到代码里,特别是开源项目
  • 环境差异:开发、测试、生产环境配置大不一样,切换麻烦
  • 维护成本:代码改配置混一起,复杂又容易出错

二、环境变量管理(推荐)

1. 直接用 OS 环境变量

Python 里用 os.environ 读:

import os
SECRET_KEY = os.environ.get("SECRET_KEY", "default_secret")
DATABASE_URL = os.environ.get("DATABASE_URL", "sqlite:///test.db")

启动前在终端设置:

export SECRET_KEY="超复杂密钥"
export DATABASE_URL="mysql://user:pass@host/db"
flask run

Windows PowerShell:

$env:SECRET_KEY="超复杂密钥"

优点:安全、灵活,适合 Docker / 云环境。


2. 用 python-dotenv 加载 .env 文件

安装:

pip install python-dotenv

项目根目录放个 .env

SECRET_KEY=超复杂密钥
DATABASE_URL=mysql://user:pass@host/db

代码里:

from dotenv import load_dotenv
import os

load_dotenv()  # 自动加载 .env 文件

SECRET_KEY = os.environ.get("SECRET_KEY")
DATABASE_URL = os.environ.get("DATABASE_URL")

这样开发时不用每次都手动 export,方便快捷。


三、Flask 自带 Config 对象的使用

Flask app 有个内置的 app.config,支持多种方式加载配置。

1. 从 Python 文件加载

建个 config.py

DEBUG = True
SECRET_KEY = "测试密钥"
SQLALCHEMY_DATABASE_URI = "sqlite:///test.db"

加载:

app.config.from_object("config")

2. 支持多环境配置

config.py

class Config:
    SECRET_KEY = "default_secret"

class DevConfig(Config):
    DEBUG = True
    SQLALCHEMY_DATABASE_URI = "sqlite:///dev.db"

class ProdConfig(Config):
    DEBUG = False
    SQLALCHEMY_DATABASE_URI = "mysql://prod_db"

启动时选:

app.config.from_object("config.DevConfig")

3. 结合环境变量灵活切换

import os

env = os.environ.get("FLASK_ENV", "dev")

if env == "prod":
    app.config.from_object("config.ProdConfig")
else:
    app.config.from_object("config.DevConfig")

四、总结

  • 敏感信息用环境变量,切忌硬编码
  • .env + python-dotenv 开发时更方便
  • Flask config.py 支持层级继承,利于多环境管理
  • 结合环境变量实现启动时自动切换配置环境

配置管理一搞定,后续开发、测试、部署都省事不少。


添加微信