Flask、Python和插座.io:多线程应用程序提供“RuntimeError:在请求上下文之外工作”

2024-06-26 13:51:55 发布

您现在位置:Python中文网/ 问答频道 /正文

使用烧瓶和应用程序-插座.io图书馆。我遇到的问题是,由于某些上下文问题,以下代码无法正确执行emit

RuntimeError: working outside of request context

我现在只为整个程序编写一个python文件。这是我的代码(测试.py):

^{pr2}$

在StackExchange,我读过一些解决方案,但都没用。我不知道我做错了什么。在

我尝试在我的emit之前添加with app.app_context():

def someotherfunction():
    # some other tasks
    with app.app_context():
        emit('anEvent', jsondata, namespace='/test') # same error here

我尝试过的另一个解决方案是在someotherfunction()之前添加装饰器copy_current_request_context,但它说装饰器必须在本地范围内。我把它放在someotherfunction()内,第一行,但是同样的错误。在

如果有人能帮我,我会很高兴的。提前谢谢。在


Tags: 代码ioapp应用程序图书馆烧瓶requestwith
2条回答

您的错误是“在请求上下文之外工作”。您试图通过推送应用程序上下文来解决它。相反,您应该推送请求上下文。请参阅http://kronosapiens.github.io/blog/2014/08/14/understanding-contexts-in-flask.html上关于烧瓶中上下文的说明

somefunction()中的代码可能使用请求上下文中全局的对象(如果我不得不猜测您可能使用的是request对象)。当代码不在新线程中执行时,它可能会正常工作。但是当你在一个新的线程中执行它时,你的函数就不再在原来的请求上下文中执行了,它也不再能够访问特定于请求上下文的对象。所以你必须手动推动它。在

所以你的功能应该是

def someotherfunction():
    with app.test_request_context('/'):
        emit('anEvent', jsondata, namespace='/test')

您在这里使用了错误的emit。必须使用所创建的socketio对象的emit。所以不是

emit('anEvent', jsondata, namespace='/test') # here occurs the error 使用: socketio.emit('anEvent', jsondata, namespace='/test') # here occurs the error

相关问题 更多 >