2013-03-24 51 views
9

我工作的一个应用程序,它类似于烧瓶:如何管理不同的环境数据库?

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 

我想有三种环境DevTestProduction
我有以下要求:
一)当我启动服务器python runserver.py,我想提一提我要连接的环境 - DevTestProduction
湾)Dev & Production应有的架构建立,只是需要连接到机器
角),我也想为我的测试连接到sqlite db,并创建模式,运行测试

哪有我以配置方式实现这一点,以便我不必硬编码与数据库相关的任何内容。

瓶子里有没有什么好的图案?

目前我runerver.py已经硬编码了的环境,我不喜欢,

app = Flask(__name__) 
app.config['SECRET_KEY'] = dev.SECRET_KEY 

我要寻找更好的想法比我

+1

flask提供了一些示例来帮助您开始使用它们的文档http://flask.pocoo.org/docs/config/#development-production – dm03514 2013-03-24 20:00:25

回答

15

解决方案使用:

#__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”的原因,第二个配置文件不是必需的,而设置.py开发默认值和普通配置键默认值

如果除了第一个值之外还加载了其他settings_file,它将覆盖原始值中的值。(在我的例子调试和SERVER_NAME将overrided,而SECRET_KEY对所有服务器保持相同)

你应该发现自己的唯一的事情取决于你如何启动应用程序
之前推出ENVVAR MYCOOLAPP_CONFIG应设置
方式 比如我的主管后台进程运行和生产服务器上我只把这个上司的配置文件:

environment=MYCOOLAPP_CONFIG="/home/tigra/mycoolapp/settings_production.py" 

通过此方式,您可以轻松管理您的所有配置文件,而且,用这种方法可以排除这个文件从git或任何其他版本控制工具

Linux默认的方式是这样一个控制台启动前:
export MYCOOLAPP_CONFIG="/home/tigra/mycoolapp/settings_production.py"

+0

谢谢!这是一个很好的帮助! – daydreamer 2013-03-26 22:30:22

+0

http://flask.pocoo.org/docs/config/#configuring-from-files是有关此更多信息的好资源 – Eddie 2013-04-06 20:37:15

2

您可以创建一个“配置”模块,其中包含的配置为每个环境。此后,可以通过设置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) 

运行开发服务器,甚至是测试可以是一个麻烦之前设置环境变量,所以我自动完成这些动作与生成文件。

也看看烧瓶脚本http://flask-script.readthedocs.org/en/latest/

+1

在env var中拥有实际环境而不是模块名称。 – linkyndy 2015-06-30 13:54:48

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 

这继承了配置类可以包含您的默认值。从那里,main.py具有从config.py文件创建瓶子实例的方法,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处理基于通过命令行参数的环境设置,但你可以得到如何的想法工作(注意,这需要烧瓶脚本):

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() 

从这里,你可以从一个环境变量,或者您选择的其他方法,选择所需的配置类。

2

烧瓶有一种叫做Instance folders的东西,它可以有不同的可能的配置并相应地加载它们。