python - Flask、Python 和 Socket.io : multithreading app is giving me "RuntimeError: working outside of request context"

标签 python multithreading sockets flask socket.io

我一直在使用 FlaskPythonFlask-Socket.io 库开发应用程序。我遇到的问题是,由于某些上下文问题,以下代码将无法正确执行 emit

RuntimeError: working outside of request context

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

from threading import Thread
from flask import Flask, render_template, session, request, jsonify, current_app, copy_current_request_context
from flask.ext.socketio import *

app = Flask(__name__)
app.debug = True
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)

def somefunction():
    # some tasks
    someotherfunction()

def someotherfunction():
    # some other tasks
    emit('anEvent', jsondata, namespace='/test') # here occurs the error

@socketio.on('connect', namespace='/test')
def setupconnect():
    global someThread
    someThread = Thread(target=somefunction)
    someThread.daemon = True

if __name__ == '__main__':
    socketio.run(app)

在 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() 的第一行,但同样的错误。

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

最佳答案

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

您的 somefunction() 中的代码可能使用在请求上下文中是全局的对象(如果我不得不猜测您可能使用请求对象)。当您的代码未在新线程内执行时,它可能会起作用。但是当您在新线程中执行它时,您的函数不再在原始请求上下文中执行,并且它不再具有访问请求上下文特定对象的权限。所以你必须手动插入它。

所以你的函数应该是

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

关于python - Flask、Python 和 Socket.io : multithreading app is giving me "RuntimeError: working outside of request context",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31647081/

相关文章:

python - 如何使用线程/多处理来防止程序挂起?

java - 使用 Netty 理解并解决文件传输问题

c# - 如何重复读取套接字?

python - 使用 ID 列表进行过滤时,如何从 Django 查询中获取有限的结果?

python - 如何在 Cython 中将函数指针传递给外部程序

android - Python自动化脚本文件传输

android - 可以从 AsyncTask.doInBackground() 读取 UI 线程中的值

php - 在 PHP 中,exec 有时会默默地失败,当调用许多 exec 命令时,但稍后再次运行相同的命令会起作用

java - java中同步块(synchronized block)的部分执行

c - 由于 dup2,scanf 不起作用