Flask:如何管理不同的环境数据库?

day*_*mer 11 python flask flask-sqlalchemy

我正在开发一个类似的应用程序

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 
Run Code Online (Sandbox Code Playgroud)

我希望有三个环境Dev,Test并且Production.
我有以下要求:
A)当我启动服务器.python runserver.py,我想提一提我想要的环境,连接- Dev,TestProduction.
b.)Dev&Production应该建立架构,只需要连接到机器
c.)我也想让我的测试连接到sqlite db,并创建架构,运行测试

如何以配置方式实现此目的,以便我不必硬编码与数据库相关的任何内容.

烧瓶中是否有任何好的图案?

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

app = Flask(__name__)
app.config['SECRET_KEY'] = dev.SECRET_KEY
Run Code Online (Sandbox Code Playgroud)

我正在寻找比我更好的想法

Tig*_*gra 20

解决方案我使用:

#__init__.py
app = Flask(__name__)
app.config.from_object('settings')
app.config.from_envvar('MYCOOLAPP_CONFIG',silent=True)
Run Code Online (Sandbox Code Playgroud)

在应用程序加载的同一级别上:

#settings.py
SERVER_NAME="dev.app.com"
DEBUG=True
SECRET_KEY='xxxxxxxxxx'


#settings_production.py
SERVER_NAME="app.com"
DEBUG=False
Run Code Online (Sandbox Code Playgroud)

所以.如果环境变量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"
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以轻松管理所有配置文件,此外,通过这种方式,您可以从git或任何其他版本控制实用程序中排除此文件

在启动之前,默认的Linux方式是在控制台中:
export MYCOOLAPP_CONFIG="/home/tigra/mycoolapp/settings_production.py"


Edd*_*die 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
Run Code Online (Sandbox Code Playgroud)

这将继承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
Run Code Online (Sandbox Code Playgroud)

然后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() 
Run Code Online (Sandbox Code Playgroud)

从这里,您可以从环境变量或您选择的其他方法中选择所需的Config类.