RuntimeError:在请求上下文之外工作

2023-11-27

我正在尝试创建一个“保持活动”的 websocket 线程,一旦有人连接到该页面,每 10 秒向浏览器发送一次发射,但我收到错误,并且不确定如何解决它。

关于如何实现这项工作有什么想法吗?

一旦发送“断开连接”,我将如何终止该线程?

Thanks!

@socketio.on('connect', namespace='/endpoint')
def test_connect():
    emit('my response', {'data': '<br>Client thinks i\'m connected'})

    def background_thread():
        """Example of how to send server generated events to clients."""
        count = 0
        while True:
            time.sleep(10)
            count += 1
            emit('my response', {'data': 'websocket is keeping alive'}, namespace='/endpoint')

    global thread
    if thread is None:
        thread = Thread(target=background_thread)
        thread.start()

您编写后台线程的方式要求它知道谁是客户端,因为您要向它发送直接消息。因此,后台线程需要访问请求上下文。在 Flask 中,您可以使用以下命令在线程中安装当前请求上下文的副本copy_current_request_context装饰器:

@copy_current_request_context
def background_thread():
    """Example of how to send server generated events to clients."""
    count = 0
    while True:
        time.sleep(10)
        count += 1
        emit('my response', {'data': 'websocket is keeping alive'}, namespace='/endpoint')

几点注意事项:

  • 发送回客户端时不需要设置命名空间,默认情况下emit调用将在客户端使用的同一命名空间上进行。当您在请求上下文之外广播或发送消息时,需要指定命名空间。
  • 请记住,您的设计将需要为每个连接的客户端提供单独的线程。如果有一个向所有客户端广播的后台线程,效率会更高。请参阅我在 Github 存储库上的示例应用程序作为示例:https://github.com/miguelgrinberg/Flask-SocketIO/tree/master/example

要在客户端断开连接时停止线程,您可以使用任何多线程机制来让线程知道它需要退出。例如,这可以是您在断开连接事件上设置的全局变量。一个不太好但易于实施的替代方案是等待emit当客户端离开时引发异常并使用它退出线程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RuntimeError:在请求上下文之外工作 的相关文章

随机推荐

  • 在 Perl 中获取 UTC 偏移量的最佳方法是什么? [复制]

    这个问题在这里已经有答案了 我需要以跨平台 Windows 和各种风格的 Unix 方式在 Perl 中获取当前时区的 UTC 偏移量 它应该满足以下格式 zzzzzz 表示相对于 UTC 的 hh mm 看来我应该能够通过strftime
  • 如何为 log4j 设置单独的日志记录流?

    假设我有一堂这样的课 public class MyClass private Logger log LoggerFactory getLogger MyClass class org slf4j LoggerFactory public
  • 在 Chrome 中上传返回 Aw, Snap 页面

    从 chrome 的上次更新 版本 36 0 1985 125 m 开始 我遇到了 uplodify 插件 flash 的问题 Chrome 会显示 噢 Snap Page 有时还会显示 他死了 吉姆 这是我的上传代码
  • Android 文件管理器库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 诚然 我在 Android 开发方面没有经验 我正在寻找一些 API 可以让我浏览用户文件 而无需通过意图安装单独的应用程序 现在我已经找到了OI
  • java程序中的代理设置

    我正在尝试通过 Eclipse 中的 java 程序使用从 wsdl 生成的客户端连接到 Web 服务 我正在通过代理服务器传递我的请求 但似乎请求没有通过 相同的代理设置在 SoapUI 上运行良好 请在下面找到我设置的系统属性 Prop
  • 如何测试多个变量与单个值的相等性?

    我正在尝试创建一个函数 将多个变量与一个整数进行比较并输出一个由三个字母组成的字符串 我想知道是否有办法将其翻译成Python 所以说 x 0 y 1 z 3 mylist if x or y or z 0 mylist append c
  • 陷阱起火后退出

    拿这个脚本 bin sh fd echo Hello world exit trap fd EXIT INT for g in 1 5 do echo foo sleep 1 done 我想fd从 Control C 或脚本正常退出时触发一
  • 从多对多 SQLAlchemy 和 Postgresql 中删除

    我正在尝试从 sql alchemy 中的多对多关系中删除子对象 我不断收到以下错误 StaleDataError DELETE statement on table headings locations expected to delet
  • Android旋转imageview,我无法在onAnimationEnd()中设置imageview的最终位置

    我想在每次单击按钮时将图像视图旋转 30 度 在第一个 CLIC 上 我可以正确设置动画 但在动画后无法成功更新图像视图位置 当我再次单击按钮时 动画从图像视图的原始位置开始 而不是从第一个动画之后的最终位置开始 这是我的代码 public
  • 将文本读入缓冲区后如何逐行读取?

    首先 我通过调用fread将文本读入缓冲区 然后我想逐行读取它 该怎么做 我尝试使用 sscanf 但似乎不起作用 char textbuf 4096 char line 256 FILE fp fp fopen argv 1 r mems
  • 简单的 Javascript 来模仿在事件处理程序中使用它的 jQuery 行为

    这不是关于 jQuery 的问题 而是关于 jQuery 如何实现这种行为的问题 在 jQuery 中你可以这样做 some link id click function alert this tagName displays A 有人可以
  • 将函数相互嵌套是一种不好的做法吗? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 在嵌套函数中嵌套函数有什么缺点 这是一个例子 JS jQuery function one do something function two do something function
  • Obj-C 有@available。 Swift 有#available。我可以在 C/C++ 中使用什么?

    如果您的代码需要仅在 macOS 10 12 或更高版本中可用的功能 但您希望代码也部署到早期系统版本 您可以使用 available在 Objective C 中 if available macOS 10 12 Code that re
  • 连接“无连接” boost::asio::ip::udp::socket

    我最近通过浏览网络了解了 UDP 套接字 所有解释它的页面都提到 UDP 套接字是 无连接 如果我理解正确的话 这意味着两个套接字之间没有 连接 而是将数据报包发送到指定的端点 而不知道另一端是否正在侦听 然后我开始阅读 boost asi
  • 对泛型类的非泛型引用会导致非泛型返回类型

    我有一个遗留类 该类本身不是泛型 但其方法返回类型之一使用泛型 public class Thing public Collection
  • 函数指针声明 - __P 的作用是什么?

    函数指针定义的通常形式是 int function int int int ptr int int 但我今天看到了一个我不明白的表格 谁能解释一下吗 int close P struct db The P 宏通常用于支持 K R C 时代的
  • 如何为python 2.7.x创建虚拟环境?

    我的 mac OSX 上安装了 3 个版本的 python 机器预装了 Python 2 7 6 我之前安装过python 3 4 3 现在我通过从网站下载pkg文件安装了python 2 7 11 我还安装了 pip 和 virtuale
  • 在不知道年份的情况下使用 DateTime.TryParseExact

    我有一个方法 有时 接受以下格式的字符串 dddd MMMM dd 1 月 4 日星期一 需要解析为 DateTime 我说有时是因为它也可能被传递进来 Today or Tomorrow 作为值 处理这个问题的代码很简单 if strin
  • 收到的电子邮件附件为“noname”

    以下 Python 函数会导致附件被命名为 noname 而本应为 text file txt 正如您所看到的 我尝试了使用 MIMEBase 和 MIMEApplication 的两种不同方法 我也尝试过 MIMEMultipart al
  • RuntimeError:在请求上下文之外工作

    我正在尝试创建一个 保持活动 的 websocket 线程 一旦有人连接到该页面 每 10 秒向浏览器发送一次发射 但我收到错误 并且不确定如何解决它 关于如何实现这项工作有什么想法吗 一旦发送 断开连接 我将如何终止该线程 Thanks