我有一个烧瓶视图,执行该视图以在生成器中加载一些信息(我正在使用生成器,以便我可以连续产生进度 - 加载了多少信息)。这是视图的样子:
@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"