Горячая перезагрузка свойств в Python Flask / Django app

#python #django #flask

#python #django #flask

Вопрос:

Гуру, мастера, гики

Мне поручено предоставить приложениям Python Flask (в более общем смысле, веб-приложениям, написанным на python) способ перезагрузки свойств «на лету».

В частности, моя команда и я в настоящее время развертываем приложения python с {env}.properties файлом, который содержит различные конфигурации, зависящие от среды, в формате ключевого значения (например, yaml). В идеале эти свойства перезагружаются приложением при изменении. Предположим, что существует вторичное приложение, которое обновляет ранее упомянутый {env}.properties файл, приложение также должно иметь возможность считывать и использовать новые значения.

В настоящее время мы считываем {env}.properties при запуске, и доступ к значениям осуществляется через функции, хранящиеся в context.py . Я мог бы написать функцию, которая могла бы периодически обновлять переменные. Прежде чем начать подобную попытку, я подумал, что проконсультируюсь с коллективом, чтобы узнать, решил ли кто-нибудь еще это для проектов Django или Flask (поскольку это кажется разумным запросом на флаги функций и т. Д.).

Ответ №1:

Одним из таких шаблонов является шаблон фабрики приложений WSGI.

Короче говоря, вы определяете функцию, которая создает экземпляр объекта приложения. Этот шаблон работает со всеми фреймворками на основе WSGI.

Документы Flask довольно хорошо объясняют фабрики приложений.

Это позволяет динамически определять приложение «на лету», без необходимости повторного развертывания или развертывания многих конфигураций приложения. Таким образом вы можете изменить практически все в приложении, включая конфигурацию, маршруты, промежуточные программы и многое другое.

Простым примером этого может быть что-то вроде:

 def get_settings(env):
    """get the (current, updated) application settings"""
    ...
    return settings

def create_app(env: str):
    if env not in ('dev', 'staging', 'production'):
        raise ValueError(f'{env} is not a valid environment')
    app = Flask(__name__)
    app.config.update(get_settings(env))
    return app
  

Затем вы могли бы установить FLASK_APP переменную среды на что-то вроде "myapp:create_app('dev')" , и это сделало бы это. Это также тот же способ, которым вы могли бы указать это для таких серверов, как gunicorn .

get_settings Функция должна быть написана для возврата новейших настроек. Это может даже сделать что-то вроде извлечения настроек из внешнего источника, такого как S3, служба конфигурации или что-нибудь еще.