0

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

这是一个示例:

@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 是否也制作会话/请求的只读(或读取和丢弃写入)副本?

4

2 回答 2

1

最简单且最好的答案是使用已在此处完整描述的全局变量。

但是,如果您的应用程序要进行扩展并且您需要与其他实例共享这些数据,您可以使用“Redis”作为快速的内存数据库。更多细节

于 2021-02-05T16:01:04.107 回答
1
  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)

当然这是一个幼稚的实现——因为这个对象仓库将在所有请求和会话之间共享——所以应该有一个保护机制(例如:1.将会话中的所有东西存储在某个键下 2.进行清理线程等)

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

  1. 是的,@copy_current_request_context制作了上下文的只读副本(据我测试)
于 2021-02-07T13:51:44.463 回答