Есть несколько способов переопределения.
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 пути лучше.
Надеюсь, это поможет.