如何在Flask中的蓝图之间共享对象

时间:2014-11-28 14:27:44

标签: flask

我有两个蓝图,例如authsprints,结构如下:

auth
    __init__.py
    views.py
    forms.py
sprints
    __init__.py
    views.py
    forms.py

我想在登录成功后共享api对象

@auth.route('/login', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        try:
            jira_url = app.config["JIRA_URL"]
            app_id = app.config["JIRA_APPID"]
            api = GreenHopper(options={"server": jira_url, "appid": 37},
                              basic_auth=(form.username.data, form.password.data))
            g.api = api
        except JIRAError:
            api = None
        ...
        ...
        return redirect(request.args.get('next') or url_for('scrumworks.index'))
    return render_template('auth/login.html', form=form)

sprints蓝图上,我想获取api对象,如下面的代码:

@scrumworks.route("/sprints")
@login_required
def show_sprints():
    if current_user.admin:
        sprints = g.api.sprints(37)
        return render_template("scrumworks/sprints.html")
    else:
      flash("Only admin users can access this page")
       return redirect(url_for(".index"))

当代码运行时,它会抱怨 AttributeError:' _AppCtxGlobals'对象没有属性' api'

似乎g的生命周期是按请求而非全局,因此我无法在api

中存储g

另一个选择是session,但api对象无法序列化,因此无法将其存储在session中,我该怎么办呢?

有什么想法吗?谢谢: - )

1 个答案:

答案 0 :(得分:3)

g对象仅在请求之间可用。

解决此问题的快捷方法是将api对象添加到定义Flask app的全局空间中,然后从那里导入api对象。 / p>

请记住,对于多个服务器和并发,此对象可能会很快失去同步,并且应保持无状态。

请参阅github上的this projec t以获取示例

首选解决方案是使用符合对象需求的数据库。 Redis,MongoDB和PostgreSQL是一些比较常见的。