新手必備: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 應用會更靈活、更安全,也更容易在不同環境中部署!

小夜