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