我处于收到客户留言的情况.在处理该请求的函数内(@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 …
我正在尝试在树莓派 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/ )匹配所有内容?
我怎样才能解决这个问题?谢谢
我知道有人会面临这个问题。我今天遇到了这个问题,但我可以及时解决它,我想分享我的解决方案:
问题:
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
问题应该消失
背景
我正在尝试使用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发出请求才能检查特定用户是否经过身份验证/授权连接到特定套接字?
当我尝试运行 Web 应用程序的后端时,出现以下错误:ImportError: cannot import name 'run_with_reloader' from 'werkzeug.serving'
。它来自 \lib\site-packages\werkzeug\serving.py 文件。我认为这与我的服务器文件中的行有关from flask_socketio import SocketIO
。有任何想法吗?
我尝试设置一个最小的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) 我正在使用套接字 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)
什么可能导致此警告,它是什么意思?
我正在尝试为我的 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)
我在这里做错了什么?
我有一个运行flask 和flask-socketio 端点的flask 应用程序。当我在 google App 引擎上进行部署时,我意识到应用引擎不支持 websockets。这意味着我需要为我的flask-socketio 使用计算引擎,并为我假设的常规烧瓶端点使用应用程序引擎。我将如何创建这两个实例并在相互连接的同时并行运行它们?这可能吗?如果我的思路没有走上正确的轨道,请指出我正确的方向。
google-app-engine flask google-compute-engine google-cloud-platform flask-socketio
我正在尝试构建一个客户端服务器架构,我正在使用 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) flask-socketio ×10
python ×8
flask ×6
socket.io ×3
eventlet ×2
dnspython ×1
gevent ×1
javascript ×1
raspberry-pi ×1
systemd ×1
ubuntu ×1
webrtc ×1
werkzeug ×1