如何更新python线程中的flask会话?下面的代码抛出了这个错误:
*** RuntimeError:在请求上下文之外工作
from flask import session
def test(ses):
ses['test'] = "test"
@app.route('/test', methods=['POST', 'GET'])
def mytest():
t = threading.Thread(target=test, args=(session, ))
t.start()
答案 0 :(得分:2)
当您执行t.start()
时,您正在创建一个独立的执行线程,该线程与主线程的执行无法以任何方式同步。
Flask session
object 仅在context of a particular HTTP request 中定义。
第二个帖子(session
)中的变量t
是什么意思?
执行t
时,无法保证来自主线程的用户请求仍然存在或处于可修改状态。也许HTTP请求已在主线程中完全处理。
Flask检测到您正在尝试操作依赖于特定上下文的对象,并且您的代码未在该上下文中运行。所以它提出了一个例外。
有多种方法可以将多个线程的输出同步到单个请求上下文中,但是...... 您实际上在这里尝试做什么?
答案 1 :(得分:1)
我所见过的任何文档都没有真正阐明为什么在此框架中不可能实现这一点-好像他们从未听说过用例一样。
简而言之,内置会话使用用户的浏览器(cookie)作为会话的存储空间-这不是我理解的会话,哦,男孩的安全问题-不要在其中存储任何秘密-会话基本上是JSON编码的,压缩后设置为cookie-我猜至少是签名的。Flask-Session通过使行为更像其他框架中的会话来缓解安全问题-cookie只是不透明的标识符,仅在后端有意义-但是每次会话更改时值都会更改,要求将cookie发送到再次使用浏览器-后台线程很久以前就无法访问该请求,因此您所拥有的只是一种单向数据传输-从会话到后台任务。
我可以建议行李提取方式吗?您的初始请求处理功能会在某些共享存储中指定一些密钥-磁盘上的文件,数据库中由某个密钥标识的行,在内存高速缓存中的对象密钥-无论如何-并将其放入会话中,然后传递会话到您的后台进程,该进程可以检查会话中放置结果的位置。然后,您随后的请求处理功能可以在此位置检查结果。