Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Flask:如何管理不同的环境数据库?_Python_Flask_Flask Sqlalchemy - Fatal编程技术网

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

Python Flask:如何管理不同的环境数据库?,python,flask,flask-sqlalchemy,Python,Flask,Flask Sqlalchemy,我正在开发一个类似于的应用程序 facebook/ __init__.py feed/ __init__.py business.py views.py models/ persistence.py user.py chat/ __in

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

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
测试
生产

b、 )
Dev
&
Production
应该构建架构,只需要连接到机器
c、 )我还想让我的测试连接到
sqlite db
,并创建模式,运行测试

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

烧瓶里有好的图案吗

目前,我的
runserver.py
具有针对我不喜欢的环境的硬编码

app = Flask(__name__)
app.config['SECRET_KEY'] = dev.SECRET_KEY
我正在寻找比我更好的想法

您可以创建一个“配置”模块,其中包含每个环境的配置。此后,可以通过设置shell变量来指定当前运行的环境

如果在主init文件中初始化flask应用程序,也可以在那里设置配置。以下是我设置配置的方式:

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脚本。

我使用的解决方案:

#__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
所以。 如果环境变量mycolapp_CONFIG不存在->将只加载settings.py,这是指默认设置(对于我来说是开发服务器)
这就是“silent=True”的原因,第二个配置文件不是必需的,而settings.py默认用于开发,默认值用于公共配置键

如果除第一个设置外,还将加载任何其他设置,则其中的值将覆盖原始设置中的值。(在我的示例中,DEBUG和SERVER_名称将被覆盖,而SECRET_密钥对所有服务器保持不变)

您唯一应该自己发现的事情取决于您启动应用程序的方式
在启动ENVVAR MYCOOLAPP_之前,应设置配置
例如,我使用supervisor daemon运行,在生产服务器上,我只是将其放在supervisor配置文件中:

environment=MYCOOLAPP_CONFIG="/home/tigra/mycoolapp/settings_production.py"
通过这种方式,您可以轻松地管理所有配置文件,而且,通过这种方式,您可以从git或任何其他版本控制实用程序中排除这些文件

默认的Linux方式是启动前控制台中的方式:

导出mycolapp\u CONFIG=“/home/tigra/mycolapp/settings\u production.py”

我想这就是您想要的:

但也要检查flask empty项目,它是具有特定环境配置的flask应用程序的样板

您可以在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脚本):


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

Flask有一个名为的东西,它可以有不同的可能配置并相应地加载它们。

您可以在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"

flask提供了两个示例,让您在他们的文档中开始学习。这是一个很好的来源,可以获得更多关于此的信息。对于在env var中使用实际环境,而不是模块名,我们表示感谢。
export FLASK_ENV="local"