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

spinngod.py - начальный код приложения колбы

from app import create_app
import sys

run_profile = str(sys.argv[1]) if len(sys.argv) >= 2 else 'development'
app = create_app(run_profile)

print("App Root Path:" + app.root_path)

if __name__ == '__main__':
    print sys.path
    app.run(debug=True, host='0.0.0.0')

app / init .py - создает приложение фляги

def create_app(profile_name):
    print "currently active profile:" + profile_name
    app = Flask(__name__)

    ############# configurations ####################
    app.config.from_object(config[profile_name])
    configure_app(app)
    configure_app_logger(app)

    #################### blueprint registration and rest_plus namespace additions ###############
    from api_1_0 import api as api_1_0_blueprint
    from api_1_0.restplus import api_restplus

    # ************************************************** #
    api_restplus.init_app(api_1_0_blueprint)
    api_restplus.add_namespace(application_namespace)
    api_restplus.add_namespace(pipeline_template_namespace)
    api_restplus.add_namespace(loadbalancer_namespace)
    api_restplus.add_namespace(servergroup_namespace)
    api_restplus.add_namespace(task_namespace)
    # ************************************************** #

    app.register_blueprint(api_1_0_blueprint)

    ##############################################################
    return app

Я хочу получить доступ к переменным конфигурации фляги, определенным в config.py, в некоторых других файлах, которые находятся вне контекста приложения. Конфигурация приложения зависит от того, с каким профилем оно запущено (dev, stage или production) и которое передается из командной строки в виде аргумента.

Единственный способ получить доступ к переменным конфигурации вне контекста приложения - это установить профиль (dev, stage или prod) в качестве переменной среды и затем импортируйте напрямую из конфигурационного файла.

Второй способ, которым я попытался, - это перенести создание приложения фляги в метод app / init .py.

Вот так я пытаюсь получить доступ к переменным конфигурации в другом классе.

import requests


class Client(object):
    def __init__(self):
        from app import app
        print "fjaijflkajsf" + app.config['SPINNAKER_BASE_URL']
        pass

Есть ли способ сделать это лучше в колбе?

1 Ответ

0 голосов
/ 19 июля 2018

Из документов :

Вместо того, чтобы передавать приложение каждой функции, вместо него доступны прокси current_app и g.

Объект приложения Flask имеет такие атрибуты, как config, которые полезны для доступа в представлениях и командах CLI. Однако при импорте экземпляра приложения в модули вашего проекта возникают проблемы с циклическим импортом.

Flask решает эту проблему в контексте приложения. Вместо прямого обращения к приложению вы используете прокси-сервер current_app, который указывает на приложение, обрабатывающее текущее действие.

Вы импортируете current_app так:

from flask import current_app

, а затем получить доступ к конфигурации или другим атрибутам, например так:

config = current_app.config

Пример:

src / application.py (где config задается в контексте)

create_app():
  app = Flask('app')
  app.config.from_object(some_class)
  return app

SRC / модуль / another_module.py

from flask import current_app

def function_that_requires_config():
    config = current_app.config

Альтернатива:

src / application.py (где config задается в контексте)

APP = create_app(os.environ.get('FLASK_ENV'))

SRC / модуль / another_module.py

from src.application import APP

def function_that_requires_config():
   config_value = APP.config.get(config_key, default_value)
...