Acceda a la configuración de Flask fuera de la fábrica de aplicaciones

Actualmente estoy usando el patrón de Flask Application Factory con Blueprints. El problema que tengo es cómo puedo acceder al objeto app.config fuera de la fábrica de aplicaciones.

No necesito todas las opciones de configuración de la aplicación Flask. Solo necesito 6 llaves. Así que la forma actual de hacerlo es cuando se llama a create_app (aplicación de fábrica), básicamente creo un objeto de diccionario global_config y simplemente configuro el diccionario global_config para que tenga las 6 claves que necesito.

Luego, los otros módulos que necesitan esas opciones de configuración, solo importan el diccionario global_config.

Estoy pensando, tiene que haber una mejor manera de hacer esto, ¿verdad?

Así que, al código

Mi actual archivo init .py:

def set_global_config(app_config): global_config['CUPS_SAFETY'] = app_config['CUPS_SAFETY'] global_config['CUPS_SERVERS'] = app_config['CUPS_SERVERS'] global_config['API_SAFE_MODE'] = app_config['API_SAFE_MODE'] global_config['XSS_SAFETY'] = app_config['XSS_SAFETY'] global_config['ALLOWED_HOSTS'] = app_config['ALLOWED_HOSTS'] global_config['SQLALCHEMY_DATABASE_URI'] = app_config['SQLALCHEMY_DATABASE_URI'] def create_app(config_file): app = Flask(__name__, instance_relative_config=True) try: app.config.from_pyfile(config_file) except IOError: app.config.from_pyfile('default.py') cel.conf.update(app.config) set_global_config(app.config) else: cel.conf.update(app.config) set_global_config(app.config) CORS(app, resources=r'/*') Compress(app) # Initialize app with SQLAlchemy db.init_app(app) with app.app_context(): db.Model.metadata.reflect(db.engine) db.create_all() from authenication.auth import auth from club.view import club from tms.view import tms from reports.view import reports from conveyor.view import conveyor # Register blueprints app.register_blueprint(auth) app.register_blueprint(club) app.register_blueprint(tms) app.register_blueprint(reports) app.register_blueprint(conveyor) return app 

Un ejemplo de un módulo que necesita acceso a esas opciones global_config:

 from package import global_config as config club = Blueprint('club', __name__) @club.route('/get_printers', methods=['GET', 'POST']) def getListOfPrinters(): dict = {} for eachPrinter in config['CUPS_SERVERS']: dict[eachPrinter] = { 'code': eachPrinter, 'name': eachPrinter } outDict = {'printers': dict, 'success': True} return jsonify(outDict) 

¿Tiene que haber una mejor manera de pasar un diccionario global alrededor de la aplicación correcta?

No hay necesidad de usar nombres globales aquí, lo que anula el propósito de usar una fábrica de aplicaciones en primer lugar.

En las vistas, como en su ejemplo, current_app está vinculada a la aplicación que maneja el contexto de solicitud / aplicación actual.

 from flask import current_app @bp.route('/') def example(): servers = current_app.config['CUPS_SERVERS'] ... 

Si necesita acceder a la aplicación mientras configura un anteproyecto, el decorador de record marca las funciones a las que se llama con el estado en el que se está registrando.

 @bp.record def setup(state): servers = state.app.config['CUPS_SERVERS'] ...