如何将变量传递到Connexion Flask应用程序上下文中?

时间:2018-12-27 07:20:09

标签: python flask connexion

我这样运行Connexion / Flask应用程序:

import connexion
from flask_cors import CORS
from flask import g

app = connexion.App(__name__, specification_dir='swagger_server/swagger/')
app.add_api('swagger.yaml')
CORS(app.app)
with app.app.app_context():
    g.foo = 'bar'
    q = g.get('foo') # THIS WORKS
    print('variable', q)
app.run(port=8088, use_reloader=False)

代码中的其他地方:

from flask import abort, g, current_app

def batch(machine=None):  # noqa: E501
    try:
        app = current_app._get_current_object()
        with app.app_context:
            bq = g.get('foo', None) # DOES NOT WORK HERE
            print('variable:', bq)
        res = MYHandler(bq).batch(machine)
    except:
        abort(404)
    return res

这不起作用-我无法将变量('bla')传递给第二个代码示例。

任何想法如何正确传递上下文变量?还是如何传递变量并将其全局用于所有Flask处理程序?

我尝试了此解决方案(有效):在第一个代码部分中,我将添加:

app.app.config['foo'] = 'bar'

在第二个代码部分中将是:

bq = current_app.config.get('foo')

此解决方案未使用应用程序上下文,因此我不确定这是否正确。

2 个答案:

答案 0 :(得分:2)

使用工厂函数来创建您的应用程序,并在那里也初始化应用程序范围的变量。然后将这些变量分配给current_app块内的with app.app.app_context()

import connexion
from flask import current_app

def create_app():
    app = connexion.App(__name__, specification_dir='swagger_server/swagger/')
    app.add_api('swagger.yaml')
    foo = 'bar' # needs to be declared and initialized here
    with app.app.app_context():
        current_app.foo = foo

    return app

app = create_app()
app.run(port=8088, use_reloader=False)

然后按以下方式在您的处理程序中访问这些变量:

import connexion
from flask import current_app

def batch():
    with current_app.app_context():
        local_var = current_app.foo
        print(local_var)

    print(local_var)

def another_request():
    with current_app.app_context():
        local_var = current_app.foo
        print('still there: ' + local_var)

答案 1 :(得分:-1)

These SO answers描述请求内和请求外内容有所不同,可能会对您有所帮助。