11

私は似たようなアプリに取り組んでいます

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 

3つの環境が欲しいDev、、。 次の要件があります。a 。)サーバーを起動するときに、接続する環境-、、またはを指定します。 b。)&スキーマを構築し、マシンに接続する必要があります c。)テストをに接続し、スキーマを作成して、テストを実行します。 TestProduction

python runserver.pyDevTestProduction
DevProduction
sqlite db

データベースに関連するものをハードコーディングする必要がないように、構成方法でこれを実現するにはどうすればよいですか。

フラスコで利用できる良いパターンはありますか?

現在、私runerver.pyは好きではない環境のハードコーディングをしていますが、

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

私は自分が持っているよりも良いアイデアを探しています

4

5 に答える 5

24

私が使用する解決策:

#__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」の理由であり、2番目の構成ファイルは不要ですがsettings.pyのデフォルト開発用および一般的な構成キーのデフォルト値

最初の1つの値に加えて、他のsettings_fileがロードされる場合、その中の値は元の値をオーバーライドします。(私の例では、DEBUGとSERVER_NAMEはオーバーライドされますが、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"

于 2013-03-26T22:28:45.160 に答える
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クラスを選択できます。

于 2013-04-06T17:59:54.080 に答える
4

各環境の構成を含む「構成」モジュールを作成できます。その後、シェル変数を設定することにより、現在実行中の環境を指定できます。

メインの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- scripthttp://flask-script.readthedocs.org/en/latest/もご覧ください。

于 2013-03-24T20:05:35.500 に答える
2

Flaskにはインスタンスフォルダと呼ばれるものがあり、これにより、さまざまな構成を可能にし、それに応じてそれらをロードすることができます。

于 2014-05-05T14:40:24.200 に答える
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"
于 2020-06-10T12:33:09.950 に答える