我正在尝试在Flask应用程序内部的Python中启动新线程。我正在做由请求触发的后台工作,但是我不需要等待工作完成以响应请求。
是否可以在此子威胁中将烧瓶请求设置为传入的请求?原因是,对数据库的查询(在mongoDB前面的mongoengine)上的ACL依赖于请求的用户(它从flask的请求对象中获取它)来查看他们是否有权访问这些对象,并且因为请求是在子线程中不可用。
任何想法将不胜感激。
这是我现在如何处理它的伪代码,但是它不起作用。
@app.route('/my_endpoint', methods=['POST']) def my_endpoint_handler(): #do tracking in sub-thread so we don't hold up the page def handle_sub_view(req): from flask import request request = req # Do Expensive work thread.start_new_thread(handle_sub_view, (request)) return "Thanks"
将你的线程代码包装在中,test_request_context这样你就可以访问本地上下文:
test_request_context
@app.route('/my_endpoint', methods=['POST']) def my_endpoint_handler(): #do tracking in sub-thread so we don't hold up the page def handle_sub_view(req): with app.test_request_context(): from flask import request request = req # Do Expensive work thread.start_new_thread(handle_sub_view, (request)) return "Thanks"
编辑:值得指出的是,该线程将具有与原始请求不同的上下文。在生成线程之前,你需要提取任何有趣的请求数据,例如用户ID。然后,你可以使用ID在子线程中获取一个(不同的)用户对象。