详解 Flask 中开发与生产环境配置的分离策略
在企业级后端接口项目中,为了满足不同环境(开发和生产)的需求,我们通常需要区分不同的配置。本指南将详细介绍如何在 Flask 应用中实现这一区分。
一、配置文件
我们创建了两个配置文件:config_dev.py
和 config_prod.py
。
config_dev.py
python
class ConfigDev:
DEBUG = True
DB_HOST = 'localhost'
DB_USER = 'dev_user'
DB_PASSWORD = 'dev_password'
DB_NAME = 'dev_database'
PORT = 5000 # 开发环境的端口
在开发配置中,我们通常开启调试模式(DEBUG = True
),使用本地数据库连接信息,并设置开发环境常用的端口。
config_prod.py
python
class ConfigProd:
DEBUG = False
DB_HOST = 'prod_host'
DB_USER = 'prod_user'
DB_PASSWORD = 'prod_password'
DB_NAME = 'prod_database'
PORT = 80 # 生产环境的端口
生产配置则关闭调试模式,使用生产环境的数据库连接信息,并设置适合生产环境的端口。
二、在应用中选择配置
在 app.py
文件中,我们根据环境变量来选择加载相应的配置。
python
from flask import Flask
import os
# 根据环境变量选择配置
if os.environ.get('ENV') == 'PROD':
from config_prod import ConfigProd as Config
else:
from config_dev import ConfigDev as Config
app = Flask(__name__)
app.config.from_object(Config)
if __name__ == '__main__':
app.run(port=app.config['PORT'])
在本地开发时,您无需设置环境变量 ENV
,应用将默认使用开发配置。而在部署到生产环境时,设置环境变量 ENV
为 PROD
,应用将加载生产配置。
三、使用 current_app._get_current_object()
在某些情况下,您可能需要在脱离 Flask 应用上下文的函数中获取当前应用的配置。这时可以使用 current_app._get_current_object()
,但要注意必须在应用上下文内调用。示例如下:
python
from flask import current_app
def get_database_info():
app = current_app._get_current_object()
db_host = app.config['DB_HOST']
db_user = app.config['DB_USER']
# 其他配置项的获取
return f"数据库主机: {db_host}, 用户: {db_user}"
# 调用示例
with app.app_context():
print(get_database_info())