如何共享在 Flask 上下文之外创建的会话值?

问题描述

如何将线程创建的内容存储在会话中,以便稍后在另一个请求中访问该值?

这是一个示例:

@app.route('/one')
def one():
    @copy_current_request_context
    def x():
        session['status'] = "done"      

    t = threading.Thread(target=x)
    t.start()
    return "One"



@app.route('/two')
def two():
    status = session['status']
    return "Two: {}".format(status)

在上面的示例中,我将线程中的“状态”(我需要运行该线程)存储在 /one 请求中,但稍后,假设 5 秒,我想检查另一个请求中的状态 (/two) .

@copy_current_request_context 是否也制作了会话/请求的只读(或读写)副本?

解决方法

最简单且不知何故最好的答案是使用已完全Here 描述的全局变量。

但是如果您的应用程序要扩展并且您需要与其他实例共享此数据,您可以使用“Redis”作为快速内存数据库。 More details

,
  1. 通过使用@soroosh-khodami 的建议,我能够实现我想要的。波纹管是可以做到这一点的代码。

warehouse = {} # This associative array will keep the data

@app.route('/one')
def one():
    global warehouse
    @copy_current_request_context
    def x():
        warehouse['status'] = "done"      

    t = threading.Thread(target=x)
    t.start()
    return "One"



@app.route('/two')
def two():
    global warehouse
    status = warehouse['status']
    return "Two: {}".format(status)

当然,这是一个幼稚的实现 - 因为这个对象 warehouse 将在所有请求和会话之间共享 - 所以应该有一个保护机制(例如:1.Store all things from a某个键下的会话 2. 有一个清理线程等)

奖励:除此之外,即使在非开发环境(例如:Twisted 服务器)中也能正常工作

  1. 是的,@copy_current_request_context 制作上下文的只读副本(就我测试而言)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...