当前位置: 首页 > 面试题库 >

启动子线程时烧瓶抛出“在请求上下文之外工作”

刘明朗
2023-03-14
问题内容

我正在尝试在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这样您就可以访问本地上下文:

@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在子线程中获取一个(不同的)用户对象。



 类似资料:
  • 问题内容: 我正在尝试使用Flask创建一个Web应用程序,该应用程序允许用户上传文件并将其提供给其他用户。现在,我可以将文件正确 地上 传到 upload_folder了 。但是我似乎找不到找到让用户下载回来的方法。 我将文件名的名称存储到数据库中。 我有一个为数据库对象服务的视图。我也可以删除它们。 在我的HTML中,我有: 和下载视图: 但它正在返回: 未找到 在服务器上找不到请求的URL。

  • 问题内容: 我正在尝试在Flask应用程序内部的Python中启动新线程。我正在做由请求触发的后台工作,但是我不需要等待工作完成以响应请求。 是否可以在此子威胁中将烧瓶请求设置为传入的请求?原因是,对数据库的查询(在mongoDB前面的mongoengine)上的ACL依赖于请求的用户(它从flask的请求对象中获取它)来查看他们是否有权访问这些对象,并且因为请求是在子线程中不可用。 任何想法将不

  • 我尝试使用axios对烧瓶服务器进行POST: 现在是烧瓶的部分 但是,我最终会出现以下错误: 无法加载XMLHttpRequesthttp://127.0.0.1:5000/test.对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“access control Allow Origin”标头。起源'http://localhost:3000因此不允许访问。 为什么?我将按照建议设置标题

  • 这是我的错误: 好了,够清楚了。我试图通过实现这个解决方案来保持请求上下文: 如何在异步任务执行器中启用请求范围 null 我已经试过了,但没有成功: 如何在异步任务执行器中启用请求范围 如果有关系: 为应用程序中的所有线程设置ThreadContext 但是上下文总是空的...

  • 问题内容: 我正在使用Netbeans 6.7和XDebug在我的计算机上调试PHP站点,并从Netbeans中启动请求(“项目”->“调试”)。这很好,并且非常有用。 我的问题是:是否可以将调试器附加到传入的任何请求中,而不仅仅是我从Netbeans中启动的那些请求? 即,不要单击“调试”,而是将Netbeans置于启动调试器并附加到下一个传入请求的模式。 我觉得这可能是一个愚蠢的问题,但是如果

  • 问题内容: app.py test.py 我正在将 应用程序 导入到 test.py中 以进行单元测试。在将’ before_request ‘函数调用到test.py中时,它会抛出RuntimeError:在应用程序上下文之外工作同样会在调用’ input_info() ‘时发生 问题答案: Flask有一个Application Context ,似乎您需要执行以下操作: 您可能还可以将调用推