我正在开发一个类似于
的应用facebook/
__init__.py
feed/
__init__.py
business.py
views.py
models/
persistence.py
user.py
chat/
__init__.py
models.py
business.py
views.py
config/
dev.py
test.py
prod.py
我希望有三种环境Dev
,Test
和Production
我有以下要求:
a。)当我启动服务器python runserver.py
时,我想提一下我想要连接的环境 - Dev
,Test
或Production
。
b。)Dev
& Production
应该构建架构,只需要连接到机器
c。)我还想让我的测试连接到sqlite db
,并创建模式,运行测试
如何以配置方式实现此目的,以便我不必硬编码与数据库相关的任何内容。
烧瓶中是否有任何好的图案?
目前我的runerver.py
已对我不喜欢的环境进行硬编码,
app = Flask(__name__)
app.config['SECRET_KEY'] = dev.SECRET_KEY
我正在寻找比我更好的想法
答案 0 :(得分:19)
我使用的解决方案:
#__init__.py
app = Flask(__name__)
app.config.from_object('settings')
app.config.from_envvar('MYCOOLAPP_CONFIG',silent=True)
在应用程序加载的同一级别上:
#settings.py
SERVER_NAME="dev.app.com"
DEBUG=True
SECRET_KEY='xxxxxxxxxx'
#settings_production.py
SERVER_NAME="app.com"
DEBUG=False
因此。
如果环境变量MYCOOLAPP_CONFIG不存在 - >只会加载settings.py,这是指默认设置(开发服务器和我一样)
这是“silent = True”的原因,第二个配置文件不是必需的,而settings.py是开发的默认值,普通配置键的默认值
如果除了第一个值之外还将加载任何其他settings_file,则覆盖原始值中的值。 (在我的示例中,DEBUG和SERVER_NAME将被覆盖,而SECRET_KEY对所有服务器保持相同)
您应该自己发现的唯一事情取决于您启动申请的方式 在启动ENVVAR之前,应设置MYCOOLAPP_CONFIG 例如,我使用supervisor守护程序运行,在生产服务器上,我只是将它放在管理程序配置文件中:
environment=MYCOOLAPP_CONFIG="/home/tigra/mycoolapp/settings_production.py"
通过这种方式,您可以轻松管理所有配置文件,此外,您可以通过这种方式从git或任何其他版本控制实用程序中排除此文件
默认的Linux方式是这个在启动前在控制台中的方式:
export MYCOOLAPP_CONFIG="/home/tigra/mycoolapp/settings_production.py"
答案 1 :(得分:6)
我认为这就是你要找的东西:
http://flask.pocoo.org/docs/config/#configuring-from-files
但是也要检查烧瓶空项目,它是带有环境特定配置的烧瓶应用的样板。
https://github.com/italomaia/flask-empty
您可以在config.py中指定配置,如下所示:
class Dev(Config):
DEBUG = True
MAIL_DEBUG = True
SQLALCHEMY_ECHO = True
SQLALCHEMY_DATABASE_URI = "sqlite:////tmp/%s_dev.sqlite" % project_name
这将继承Config类,该类可以包含您的默认值。从那里,main.py有从config.py文件创建flask实例的方法,manage.py确定加载了哪个配置。
这是main.py的一个片段,所以你明白了这个想法:
def app_factory(config, app_name=None, blueprints=None):
app_name = app_name or __name__
app = Flask(app_name)
config = config_str_to_obj(config)
configure_app(app, config)
configure_blueprints(app, blueprints or config.BLUEPRINTS)
configure_error_handlers(app)
configure_database(app)
configure_views(app)
return app
然后manage.py根据传递的命令行参数处理环境设置,但是你可以知道它是如何工作的(注意这需要flask-script):
from flask.ext import script
import commands
if __name__ == "__main__":
from main import app_factory
import config
manager = script.Manager(app_factory)
manager.add_option("-c", "--config", dest="config", required=False, default=config.Dev)
manager.add_command("test", commands.Test())
manager.run()
从这里,您可以从环境变量或您选择的其他方法中选择所需的Config类。
答案 2 :(得分:4)
你可以创建一个" config"包含每个环境配置的模块。此后,可以通过设置shell变量来指定当前运行的环境。
如果要在主 init 文件中初始化烧瓶应用程序,也可以在此处设置配置。这就是我设置配置的方式:
def setup_config(app):
"""Set the appropriate config based on the environment settings"""
settings_map = {'development': DevelopmentSettings,
'staging': StagingSettings,
'testing': TestingSettings,
'production': ProductionSettings}
env = environ['ENV'].lower()
settings = settings_map[env]
app.config.from_object(settings)
在运行开发服务器甚至测试之前设置环境变量可能很麻烦,因此我使用makefile自动执行这些操作。
另请查看flask-script http://flask-script.readthedocs.org/en/latest/。
答案 3 :(得分:2)
Flask有一个名为Instance folders的东西,它可以有不同的可能配置并相应地加载它们。
答案 4 :(得分:0)
您可以在setting.json中拥有以下属性:
{
"production": {
"DEBUG": false,
"APPLICATION_ROOT": "/app-root",
"DB_URI": "mongodb://20.0.0.2:27017/TEST_DB",
"FTP_HOST": "20.0.0.10"
},
"development": {
"DEBUG": true,
"APPLICATION_ROOT": "/app-root",
"DB_URI": "mongodb://localhost:27017/TEST_DB",
"FTP_HOST": "20.0.0.11"
},
"test":{
"DEBUG": false,
"APPLICATION_ROOT": "/app-root",
"DB_URI": "mongodb://localhost:27017/TEST_DB",
"FTP_HOST": "20.0.0.11"
},
"local": {
"DEBUG": true,
"APPLICATION_ROOT": "/app-root",
"DB_URI": "mongodb://localhost:27017/TEST_DB",
"FTP_HOST": "20.0.0.11"
},
"staging": {
"DEBUG": false,
"APPLICATION_ROOT": "/app-root",
"DB_URI": "mongodb://localhost:27017/TEST_DB",
"FTP_HOST": "20.0.0.19"
}
}
在代码中:
def load_setting():
with open('setting.json', 'r') as file:
return json.load(file)[os.getenv('FLASK_ENV')]
app = Flask('TEST-APP')
app.config.update(load_setting())
确保已将环境“ FLASK_ENV”添加为开发/本地/测试/生产。
export FLASK_ENV="local"