我正在尝试在 Flask 应用程序内的 Python 中启动一个新线程。我正在做由请求触发的后台工作,但我不需要等待工作完成来响应请求。
是否可以将这个子威胁中的flask请求设置为进来的请求?原因是,我们对数据库查询的 ACL(mongoengine 在 mongoDB 前面)依赖于请求的用户(它从 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
所以你可以访问上下文当地人 http://flask.pocoo.org/docs/quickstart/#context-locals:
@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"
Edit:值得指出的是,该线程将具有与原始请求不同的上下文。在生成线程之前,您需要提取任何有趣的请求数据,例如用户 ID。然后,您可以使用 ID 在子线程中获取(不同的)用户对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)