问题标签 [flask-socketio]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
20753 浏览

python - Python - Flask-SocketIO 从线程发送消息:并不总是有效

我处于收到来自客户的消息的情况。在处理该请求的函数(@socketio.on)中,我想调用一个完成一些繁重工作的函数。这不应导致阻塞主线程,并且认为一旦工作完成就会通知客户端。因此,我开始了一个新线程。

现在我遇到了一个非常奇怪的行为:消息永远不会到达客户端。但是,代码会到达发送消息的特定位置。更令人惊讶的是,如果线程中除了发送给客户端的消息之外什么都没有发生,那么答案实际上会到达客户端。

总结一下:如果在发送消息之前发生了计算密集型的事情,那么它就不会被传递,否则就是。

就像这里这里所说的,从线程向客户端发送消息根本不是问题:

在此之前显示的所有示例中,服务器响应客户端发送的事件。但是对于某些应用程序,服务器需要是消息的发起者。这对于向客户端发送源自服务器的事件的通知非常有用,例如在后台线程中。

这是一个示例代码。删除注释锐利 (#) 时,消息('foo from thread')不会找到到达客户端的方式,否则会。

我正在使用 Python 3.4.3、Flask 0.10.1、flask-socketio1.2、eventlet 0.17.4。

该示例可以复制并粘贴到 .py 文件中,并且可以立即重现该行为。

有人可以解释这种奇怪的行为吗?

更新

这似乎是 eventlet 的错误。如果我做:

尽管已安装它,但它强制应用程序不使用 eventlet。

但是,这对我来说不是一个适用的解决方案,因为使用“线程”作为 async_mode 拒绝接受二进制数据。每次我从客户端向服务器发送一些二进制数据时,它都会说:

WebSocket transport not available. Install eventlet or gevent and gevent-websocket for improved performance.

第三个选项,使用 gevent 作为 async_mode 对我不起作用,而且 gevent 还不支持 python 3。

那么还有其他建议吗?

0 投票
2 回答
4185 浏览

python - Heroku sock=Flask SocketIO 应用程序的后端服务器请求中断

我在 heroku 上托管了一个 flask-socketio 应用程序,其中包含以下 Procfile :

自从我切换到 socketio 后,该应用程序的行为一直不一致。早些时候,应用程序会运行一段时间,然后 POST 请求会开始超时。

从昨天晚上开始,我一直收到错误

我阅读了 Heroku 错误代码描述,上面写着“在后端返回 HTTP 响应之前,属于您的应用程序的 Web 进程的后端套接字已关闭。”

但我不知道为什么会发生这种情况。

关于我应该注意什么的任何线索都将帮助我调试它。

我可以分享代码,但它有 300 行长,而且由于我不知道错误的来源,我不确定它是否会有所帮助。

0 投票
1 回答
1845 浏览

heroku - websocket握手期间的Flask-SocketIO错误意外响应代码:400

这似乎类似于堆栈溢出的一些未解决的问题。

我在 heroku 上运行 python socketio 应用程序,当我启动网站时出现此错误:

websocket握手期间出错意外响应代码:400

我一直认为这是一个flask-socketio错误,但在线阅读类似问题让我认为这是一个socketio错误。有人知道如何进行吗?

0 投票
2 回答
11546 浏览

python - 使用 Flask 和 eventlet 响应并发请求

我尝试设置一个最小的 Flask 应用程序,它使用eventlet来立即响应并发请求,而不是阻塞和响应一个又一个请求(就像标准的 Flask 调试网络服务器所做的那样)。

先决条件:

根据我到目前为止在互联网上发现的内容的理解,它应该像这样工作:

运行此文件,然后http://localhost:5000/longTask在 webbrowser 选项卡中打开时,当它仍在处理打开另一个选项卡时http://localhost:5000/shortTask,我希望第二个选项卡在第一个选项卡仍在加载时立即返回。但是,与在标准 Werkzeug 服务器上运行此程序类似,第二个选项卡仅在第一个选项卡在 30 秒后完成后才返回。

这里有什么问题?顺便说一句,鉴于预期只有少数并发用户(最多 5 个),这是否是通常所说的 Flask 的“生产就绪网络服务器”?

顺便说一句,当我使用Flask-socketio 库运行网络服务器时,根据文档,如果安装了它,它会自动选择 eventlet,然后它按预期工作。

Flask-socketio 的完整示例:

0 投票
1 回答
19357 浏览

python - Flask中使用eventlet管理socketio

我正在尝试设置一个小型服务器来处理 HTTP 和 socketio 请求——我没有太多设置服务器的经验,但现在 apache2 可以很好地服务于 http。但是,socketio 事务不断失败,错误代码为 400(错误请求),并且我在服务器日志中看到一些奇怪的错误。有时我看到一个 engineio 错误,服务器响应“错误请求”和代码 400,但它总是告诉我需要启动 eventlet 服务器:

我的服务器代码非常基本:

我的客户端代码,用 python 编写,直接使用文档中的 socketio-client 库:

socketio.run(app)应该为我启动 eventlet 服务器吗?为什么服务器会吐回错误的请求(有时)?

0 投票
0 回答
1212 浏览

heroku - net::ERR_CONTENT_LENGTH_MISMATCH heroku

我在我的 chrome 控制台上收到此错误

当我在代码中注释掉这两个文件时,网站加载完美(当然看起来很奇怪)我还可以在开发人员控制台中看到该文件在前端加载得很好,状态码为 200 OK。

为什么会发生这种长度不匹配?

这是一个托管在heroku 上的flask-socketio 应用程序(使用gunicorn)。该网站在本地运行良好。

0 投票
1 回答
5148 浏览

flask-socketio - Server to Server Communication

I'd like to know if there's a way to communicate directly between two (or more) flask-socketio servers. I want to pass information between servers, and have clients connect a single web socket server, which would have all the combined logic and data from the other servers.

I found this example in JS Socket IO Server to Server where the solution was to use a socket.io-client to connect to another server.

I've looked through the Flask-SocketIO documentation, as well as other resources, however it doesn't appear that Flask-SocketIO has a client component to it.

Any suggestions or ideas?

0 投票
2 回答
2066 浏览

c# - Socketio - 烧瓶服务器和 c# 客户端

嘿,我正在尝试使用 SocketIO 创建一个消息传递应用程序。我有一个用烧瓶编写的服务器和一个用 C# 编写的客户端。我正在使用SocketIoClientDotNet客户端(https://github.com/Quobject/SocketIoClientDotNet)。

这是我的代码:

烧瓶:routes.py

C# :

在这两个平台上都没有打印任何内容。看起来它们之间建立了连接(在烧瓶上,一旦建立连接,这条线就会无限打印127.0.0.1 - - [20/Jan/2016 11:23:43] "GET /socket.io/?EIO=3&transport=polling&t=635888858234059292-4049&b64=1 HTTP/1.1" 200 -:)

我究竟做错了什么?

编辑:安装后gevent我开始接收连接事件。问题是它卡在上面并且没有调用其他函数。看着烧瓶控制台,它看起来像是使用拉动而不是 webSocket(某种后卫机制),所以我尝试更改 c# 套接字选项:

但它一直在打印传输=轮询

编辑2:

0 投票
2 回答
160 浏览

flask-socketio - flask-socketio:before_send/after_send

在flask socket-io上,如果有2个用户连接并且user1向user2发送消息,我如何拦截发送给user2的有效负载(在user2的应用程序上下文中,以便修改它)?我不想修改 user1 发送的有效负载(这很简单)。

从逻辑上讲,我想应该有一种方法可以在有效载荷在 ws 上传输之前拦截 user2 上下文中的事件。

谢谢!

0 投票
0 回答
364 浏览

python - Python非阻塞子进程输出读取未捕获所有输出

希望有人可以帮助解决这个问题:

问题是这个“似乎”可以工作,但是 traceroute 命令的所有输出都没有被​​捕获,只是其中的一部分。

我在网上找到了大部分内容,所以不完全理解。

基本上我正在努力做到这一点,所以我在后台运行了一个 traceroute 命令,当我从中获得输出时,我想将它从我的网络套接字(socketio)发送到浏览器。

但我不希望它阻止其他操作。

如果这对任何人有帮助,我正在使用 Python Flask/Gevent。