Как я могу переопределить параметры конфигурации в конфигурации Flask? - PullRequest
0 голосов
/ 12 мая 2018

Я использую настройки фляги и настраиваю свое приложение так:

app = Flask(__name__)
app.config.from_object('yourapplication.Config')

Мой объект конфигурации это:

class Config(object):
    DEBUG = True
    TESTING = False
    DB_USER = os.getenv("DB_USER", "db_user")
    DB_PASSWORD = os.getenv("DB_PASSWORD", "db_password")
    DB_HOST = os.getenv("DB_HOST", "localhost")  # 127.0.0.1"
    DB_PORT = os.getenv("DB_PORT", "5555")
    DB_SCHEMA = "my_schema"
    DB_DATABASE_NAME = "my_database"
    SQLALCHEMY_DATABASE_URI = "postgresql://{}:{}@{}:{}/{}".format(
        DB_USER, DB_PASSWORD, DB_HOST, DB_PORT, DB_DATABASE_NAME)
    SQLALCHEMY_TRACK_MODIFICATIONS = False

Я запускаю свое приложение так (используя скрипт-флешку):

my_flask_app cmd1 arg1 arg2

Я бы хотел сделать следующее:

DEBUG=true DB_PORT=1234 my_flask_app cmd1 arg1 arg2

и переопределить 2 параметра конфигурации. Мне интересно, есть ли способ переопределить параметры конфигурации из командной строки, или мне нужно написать код?

РЕДАКТИРОВАТЬ : Чтобы уточнить, у меня есть несколько предустановленных конфигов, которые наследуются от 'Config (объект)', например, так:

class Dev(Config):
    pass

class Ua(Config):
    pass

class Prod(Config):
    DEBUG = False

Мое приложение по умолчанию настроено на Dev. Легко представить сценарий, в котором вы хотите запустить конфигурацию 'UA', но переопределить порт следующим образом:

FLASK_ENV=UA DB_PORT=1234 my_flask_app cmd1 arg1 arg2

«FLASK_ENV» внутренне выберет объект конфигурации «UA», но я бы хотел, чтобы DB_PORT применялся сверху. Просто интересно, есть ли расширение или кто-то имел какие-либо мысли по этому поводу.

Ответы [ 2 ]

0 голосов
/ 18 июня 2018

Похоже, не существует стандартного способа реализации этой функции или библиотеки, которая добавляет это полезное поведение в настоящее время.

0 голосов
/ 15 мая 2018

Есть несколько способов переопределения.

1) с использованием config.from_envvar + config.cfg. Пример:

# test.py
import json

from flask import Flask, current_app


class Config(object):
    DEBUG = True
    TESTING = False
    DB_PORT = 1234


app = Flask(__name__)
app.config.from_object('test.Config')
app.config.from_envvar('YOURAPPLICATION_SETTINGS', silent=True)


@app.route('/')
def index():
    return json.dumps({
        'DEBUG': current_app.config['DEBUG'],
        'DB_PORT': current_app.config['DB_PORT'],
    })


if __name__ == '__main__':
    app.run()

config.cfg:

DB_PORT = 4321
DEBUG = False

Запустите наше приложение: python test.py и откройте http://127.0.0.1:5000/. Вы увидите значения конфигурации по умолчанию:

{"DEBUG": true, "DB_PORT": 1234}

Теперь добавьте путь config.cfg в переменную YOURAPPLICATION_SETTINGS и перезапустите приложение.

export YOURAPPLICATION_SETTINGS={full_path_to}/config.cfg
python test.py
# open http://127.0.0.1:5000/ 
# you will see {"DEBUG": false, "DB_PORT": 4321}

2) Аналогично первому способу, но без .cfg. test.py

import json
import os

from flask import Flask, current_app


class Config(object):
    DEBUG = True
    TESTING = False
    DB_PORT = 1234


class ProductionConfig(Config):
    DEBUG = False
    DB_PORT = 4321


class TestingConfig(Config):
    TESTING = True


app = Flask(__name__)
app.config.from_object(os.environ.get('CONFIG_CLASS', 'test.Config'))
# route + run ...

Как проверить:

python test.py # open http://127.0.0.1:5000/ - default config
# ProductionConfig config
export CONFIG_CLASS=test.ProductionConfig
python test.py # open http://127.0.0.1:5000/ - production config

3) В некоторых случаях достаточно только переменных env.

Но будьте осторожны, у вас могут быть проблемы с типами

import json
import os

from flask import Flask, current_app


class Config(object):
    DEBUG = True
    TESTING = False
    DB_PORT = 1234


app = Flask(__name__)
app.config.from_object('test.Config')
app.config.update({
    'DB_PORT': os.environ.get('DB_PORT', Config.DB_PORT)
    # you should to set type of variable here
    # DB_PORT will be string
    # 'DB_PORT': int(os.environ.get('DB_PORT', Config.DB_PORT))
})
# route + run ...

Давайте проверим:

export DB_PORT=4321
python test.py

Откройте http://127.0.0.1:5000/, вы увидите, что DB_PORT было изменено, но не является целым числом. Так что это хорошее решение для некоторых настроек и для конкретных случаев. Я думаю, что 1 и 2 пути лучше.

Надеюсь, это поможет.

...