【发布时间】:2018-12-12 17:23:26
【问题描述】:
我有一个烧瓶视图,它被执行以在生成器中加载一些信息(我正在使用生成器,以便我可以连续产生进度 - 加载了多少信息)。视图如下所示:
@app.route("/progress", methods=['GET'])
def progress():
gen = get_user_saved_tracks(session['token'], session['spotify_id'], session)
return Response(gen, mimetype= 'text/event-stream')
def get_user_saved_tracks(token, id, session):
#load information and keep yielding
session['info'] = info
我想将加载到生成器内的会话变量中的信息存储(此生成器函数在请求上下文之外的不同文件中定义)。但是当我尝试访问会话变量时,出现以下错误:
RuntimeError:在请求上下文之外工作。
那么,有没有办法以这种方式将信息写入会话?我现在正在使用 FileSystemSessionInterface,但如果这能解决我的问题,我愿意使用 redis 会话。
更新:
按照 Sraw 的建议,我尝试了以下更改:
from flask import current_app
app = current_app._get_current_object()
def get_user_saved_tracks(token, id,session):
with app.app_context():
session['info'] = info
但我仍然遇到同样的错误。
更新 2:
所以,我需要使用实际的应用程序实例而不是使用 current_app(应用程序对象是在不同的文件 - app.py 中创建的)
from app import app
def get_user_saved_tracks(token, id,session):
with app.app_context():
session['info'] = info
这样做时,我得到了同样的错误:
RuntimeError:在请求上下文之外工作。
更新 3:
以下是 get_user_saved_tracks 的代码:
def get_user_saved_tracks(token, id, session, j, service):
tracks = []
for i in range(100):
a = service.current_user_saved_tracks(limit=50, offset=i*50)
if len(a['items']) == 0:
break
yield "data:" + "lib" + str((float(i+1)/(j))*100) + "\n\n"
time.sleep(0.5)
tracks.extend(a)
session['tracks'] = tracks
session.modified = True
yield "data:" + "close" + "\n\n"
【问题讨论】:
-
@Sraw:谢谢!为问题添加了更新。
-
不行,不能这样使用
current_app。您应该直接使用app实例。我的意思是,app引用由Flask(__name__, xxxx)创建。 -
@Sraw 谢谢!添加了另一个更新。
-
我认为我们需要更多信息来帮助您。在处理请求期间您似乎没有运行该代码。
标签: python flask generator flask-session