我有两个蓝图,例如auth
和sprints
,结构如下:
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
中,我该怎么办呢?
有什么想法吗?谢谢: - )
答案 0 :(得分:3)
g
对象仅在请求之间可用。
解决此问题的快捷方法是将api
对象添加到定义Flask app
的全局空间中,然后从那里导入api
对象。 / p>
请记住,对于多个服务器和并发,此对象可能会很快失去同步,并且应保持无状态。
请参阅github上的this projec t以获取示例
首选解决方案是使用符合对象需求的数据库。 Redis,MongoDB和PostgreSQL是一些比较常见的。