标签: flask-socketio

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

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

现在我遇到了一个非常奇怪的行为:消息永远不会到达客户端.但是,代码到达发送消息的特定位置.更令人惊讶的是,如果线程中没有任何事情发生,除了消息被发送到客户端,那么答案实际上找到了通往客户端的方式.

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

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

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

这是一个示例代码.删除注释符号(#)时,消息('foo from thread')找不到客户端,否则就会找到.

from flask import Flask
from flask.ext.socketio import SocketIO, emit
app = Flask(__name__)
socketio = SocketIO(app)

from threading import Thread
import time 

@socketio.on('client command')
def response(data):
    thread = Thread(target = testThreadFunction)
    thread.daemon = True
    thread.start()

    emit('client response', ['foo'])

def testThreadFunction():
#   time.sleep(1)

    socketio.emit('client response', ['foo from thread'])

socketio.run(app)
Run Code Online (Sandbox Code Playgroud)

我使用的是Python 3.4.3,Flask 0.10.1,flask-socketio1.2,eventlet 0.17.4.

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

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

更新

这似乎是eventlet的一个bug.如果我做:

socketio = SocketIO(app, async_mode='threading')
Run Code Online (Sandbox Code Playgroud)

它会强制应用程序在安装时不使用eventlet.

但是,对于我来说这不是一个适用的解决方案,因为使用'threading'async_mode拒绝接受二进制数据.每当我从客户端向服务器发送一些二进制数据时,它会说:

WebSocket transport not available. Install eventlet or …

python multithreading gevent socket.io flask-socketio

21
推荐指数
2
解决办法
1万
查看次数

客户端正在使用不受支持的 Socket.IO 或 Engine.IO 协议版本错误

我正在尝试在树莓派 4 中使用 flask_socketio、socketIO_client 和 SOCKET.IO 在 python 中运行客户端和服务器,但出现以下错误:

The client is using an unsupported version of the Socket.IO or Engine.IO protocols (further occurrences of this error will be logged with level INFO)
192.168.1.80 - - [05/Feb/2021 18:30:41] "GET /socket.io/?EIO=3&transport=polling&t=NTpTT-L HTTP/1.1" 400 219 0.000618
Run Code Online (Sandbox Code Playgroud)

这些是我当前的版本:

pi@raspberrypi:~/Desktop/EDAdataLogger $ npm list socket.io EDAdataLogger@ /home/pi/Desktop/EDAdataLogger ??? socket.io@3.1.1

pi@raspberrypi:~/Desktop/EDAdataLogger $ npm list socket.io-client EDAdataLogger@ /home/pi/Desktop/EDAdataLogger ??? socket.io-client@3.1.1

python-engineio==4.0.0
python-socketio==5.0.4
Flask==1.1.2
Flask-Session==0.3.2
Flask-SocketIO==5.0.1
Run Code Online (Sandbox Code Playgroud)

如何定义 JavaScript Socket.IO 版本和 Socket.IO 协议修订版,以便根据 ( https://pypi.org/project/python-socketio/ )匹配所有内容?

我怎样才能解决这个问题?谢谢

python socket.io raspberry-pi flask-socketio

13
推荐指数
2
解决办法
9001
查看次数

Eventlet + DNS Python属性错误:模块“dns.rdtypes”没有任何属性

我知道有人会面临这个问题。我今天遇到了这个问题,但我可以及时解决它,我想分享我的解决方案:

问题:

from flask_socketio import SocketIO
Run Code Online (Sandbox Code Playgroud)

您将收到类似以下内容的输出错误:

属性错误:模块“dns.rdtypes”没有属性 ANY

仅当您安装了 eventlet 时才会发生这种情况,因为它会随之安装 dnspython。

解决办法很简单,重新安装之前发布的dnspython即可:

python3 -m pip install dnspython==2.2.1

问题应该消失

python dnspython eventlet flask-socketio

12
推荐指数
1
解决办法
5733
查看次数

Flask:RESTful API和SocketIO服务器

背景

我正在尝试使用Flask-RESTful扩展创建一个简单的REST API.此API主要用于管理CRUD和用户身份验证以获得简单服务.

我还尝试使用Flask-SocketIO扩展创建一些Web套接字,这些用户可以连接到这些扩展,并查看与使用该服务的其他人相关的一些数据的实时更新.因此,我需要知道这些用户已经过身份验证并有权连接到某些套接字.

问题

但是,我在设置时遇到了一些麻烦.看起来我无法让这两个组件(REST API和SocketIO服务器)在同一个Flask实例上协同工作.我说这个的原因是因为当我运行以下命令时,REST API或SocketIO服务器都可以工作,但不能同时工作:

from flask import Flask
from flask_restful import Api
from flask.ext.socketio import SocketIO

app = Flask(__name__)

api = Api(app)
socketio = SocketIO(app)

# some test resources for the API and
# a test emitter statement for the SocketIO server
# are added here

if __name__ == '__main__':
    app.run(port=5000)
    socketio.run(app, port=5005)
Run Code Online (Sandbox Code Playgroud)

这种类型的设置的典型解决方案是同时具有两个不同的Flask实例吗?例如,我的SocketIO服务器是否必须向我的REST API发出请求才能检查特定用户是否经过身份验证/授权连接到特定套接字?

python flask flask-restful flask-socketio

11
推荐指数
1
解决办法
5249
查看次数

ImportError:无法从“werkzeug.serving”导入名称“run_with_reloader”

当我尝试运行 Web 应用程序的后端时,出现以下错误:ImportError: cannot import name 'run_with_reloader' from 'werkzeug.serving'。它来自 \lib\site-packages\werkzeug\serving.py 文件。我认为这与我的服务器文件中的行有关from flask_socketio import SocketIO。有任何想法吗?

python werkzeug flask-socketio

11
推荐指数
2
解决办法
1万
查看次数

使用Flask和eventlet响应并发请求

我尝试设置一个最小的Flask应用程序,该应用程序使用eventlet立即响应并发请求,而不是阻塞并响应一个请求(如标准的Flask调试Web服务器那样).

先决条件:

pip install Flask
pip install eventlet
Run Code Online (Sandbox Code Playgroud)

从我到目前为止在互联网上发现的东西的理解,它应该像这样工作:

# activate eventlet
import eventlet
eventlet.monkey_patch()

from flask import Flask

import datetime
from time import sleep

# create a new Flask application
app = Flask(__name__)

# a short running task that returns immediately
@app.route('/shortTask')
def short_running_task():
  start = datetime.datetime.now()
  return 'Started at {0}, returned at {1}'.format(start, datetime.datetime.now())

# a long running tasks that returns after 30s
@app.route('/longTask')
def long_running_task():
  start = datetime.datetime.now()
  sleep(30)
  return 'Started at {0}, returned at …
Run Code Online (Sandbox Code Playgroud)

python flask eventlet flask-socketio

10
推荐指数
1
解决办法
7333
查看次数

WebSocket 传输不可用。安装 eventlet 或 gevent 和 gevent-websocket 以提高性能

我正在使用套接字 io 和烧瓶应用程序。除了我总是收到此消息外,一切正常。这是我的初始化:

app = Flask(__name__)
app.config['SECRET_KEY'] = APP_SECRET_KEY
jwt = JWTManager(app)
cors = CORS(app)
app.config['CORS_HEADERS'] = 'Content-Type'
# app.config['transports'] = 'websocket'
socketio = SocketIO(app, cors_allowed_origins="*", async_mode='threading')

socketio.run(app, debug=True)
Run Code Online (Sandbox Code Playgroud)

什么可能导致此警告,它是什么意思?

控制台看起来像这样: 在此处输入图片说明

  • 已经尝试安装 gevent 和 eventlet 并且它没有删除消息

flask socket.io flask-socketio

10
推荐指数
2
解决办法
9854
查看次数

Systemd:启动操作超时。终止

我正在尝试为我的 python-flask-socketio 服务器创建一个自动启动服务。

我需要通过 systemd 启动一个 python 脚本。这是我的服务代码:

[Unit]
Description=AppName


[Service]
Type=forking
ExecStart=/usr/bin/python3 /opt/myapp/app.py

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

如果我尝试使用手动启动它sudo service myservice start- 它工作得很好。它停止了我的终端\ssh 窗口,但我可以关闭它并且它按预期工作。

但是当我重新启动我的电脑时,它没有启动。当systemctl status myservice我检查它的状态时,我得到以下信息:

systemd[1]: Starting My Service...
systemd[1]: myserivce.service: Start operation timed out. Terminating.
systemd[1]: Failed to start My Service.
systemd[1]: myserivce.service: Unit entered failed state.
systemd[1]: myserivce.service: Failed with result 'timeout'.
Run Code Online (Sandbox Code Playgroud)

我在这里做错了什么?

python ubuntu flask systemd flask-socketio

9
推荐指数
2
解决办法
1万
查看次数

使用 Google Cloud Platform 运行 Websocket

我有一个运行flask 和flask-socketio 端点的flask 应用程序。当我在 google App 引擎上进行部署时,我意识到应用引擎不支持 websockets。这意味着我需要为我的flask-socketio 使用计算引擎,并为我假设的常规烧瓶端点使用应用程序引擎。我将如何创建这两个实例并在相互连接的同时并行运行它们?这可能吗?如果我的思路没有走上正确的轨道,请指出我正确的方向。

google-app-engine flask google-compute-engine google-cloud-platform flask-socketio

9
推荐指数
1
解决办法
5726
查看次数

如何将实时视频帧从客户端流式传输到 Flask 服务器并返回到客户端?

我正在尝试构建一个客户端服务器架构,我正在使用 getUserMedia() 从用户的网络摄像头捕获实时视频。现在不是直接在<video>标签中显示视频,我想将它发送到我的烧瓶服务器,对帧进行一些处理并将其扔回我的网页。

我使用 socketio 来创建客户端-服务器连接。这是我的index.html 中的脚本。请原谅我的错误或任何错误的代码。

<div id="container">
    <video autoplay="true" id="videoElement">

    </video>
</div>
Run Code Online (Sandbox Code Playgroud)
<script type="text/javascript" charset="utf-8">

    var socket = io('http://127.0.0.1:5000');

    // checking for connection
    socket.on('connect', function(){
      console.log("Connected... ", socket.connected)
    });

    var video = document.querySelector("#videoElement");


    // asking permission to access the system camera of user, capturing live 
    // video on getting true.

    if (navigator.mediaDevices.getUserMedia) {
      navigator.mediaDevices.getUserMedia({ video: true })
        .then(function (stream) {

          // instead of showing it directly in <video>, I want to send these frame …
Run Code Online (Sandbox Code Playgroud)

javascript python flask webrtc flask-socketio

9
推荐指数
1
解决办法
7777
查看次数