gpt4 book ai didi

python - 在请求上下文之外(在生成器内)设置 flask session 变量

转载 作者:行者123 更新时间:2023-12-03 21:21:41 25 4
gpt4 key购买 nike

我有一个 flask View ,它被执行以在生成器中加载一些信息(我正在使用生成器,以便我可以不断产生进度 - 加载了多少信息)。这是 View 的样子:

@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

我想存储在生成器内的 session 变量中加载的信息(此生成器函数在请求上下文之外的不同文件中定义)。但是当我尝试访问 session 变量时,出现以下错误:

RuntimeError: Working outside of request context.



那么,有没有办法将信息以这种方式写入 session 呢?我现在正在使用 FileSystemSessionInterface,但如果能解决我的问题,我愿意使用 redis session 。

更新:

根据 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: Working outside of request context.



更新 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"

最佳答案

在类似的设置中,我得到和你一样的错误。但是通过使用:

return Response(stream_with_context(....),
mimetype='text/event-stream')

它已解决。所以在你的情况下,这意味着:
from flask import Flask, stream_with_context, request, Response, session
....

return Response(stream_with_context(get_user_saved_tracks(session['token'], session['spotify_id'], session),
mimetype='text/event-stream')

编辑:

通过使用回调函数来完成您想要完成的事情的纯技术方法。如果这
你想要这种方式是一个不同的问题。
您引入了 2 个附加参数 j 和服务 (?)。
def get_user_saved_tracks(cb, token, id, 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)
cb(a) # <<--------

#self.session['tracks'] = tracks
#self.session.modified = True
yield "data:" + "close" + "\n\n"

@app.route("/progress", methods=['GET'])
def progress():
# add a callback function to update the session for the 'a' you
# calculate in get_user_saved_tracks(). The callback updates the session
session['tracks'] = []
def cb(l):
session['tracks'].extend(l)
session.modied = True

return Response(stream_with_context(get_user_saved_tracks(cb, session['token'], session['spotify_id']), # j and service ?
mimetype='text/event-stream')

关于python - 在请求上下文之外(在生成器内)设置 flask session 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51170784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com