标签: flask-socketio

使用 Flask 的 socketio 扩展从线程发射

我想向套接字客户端发出延迟消息。例如,当一个新客户端连接时,应该向客户端发出“检查开始”消息,并且在特定秒后应该从线程发出另一条消息。

@socket.on('doSomething', namespace='/test')
def onDoSomething(data):
  t = threading.Timer(4, checkSomeResources)
  t.start()
  emit('doingSomething', 'checking is started')

def checkSomeResources()
  # ...
  # some work which takes several seconds comes here
  # ...
  emit('doingSomething', 'checking is done')
Run Code Online (Sandbox Code Playgroud)

但是由于上下文问题,代码不起作用。我得到

RuntimeError('working outside of request context')
Run Code Online (Sandbox Code Playgroud)

是否可以从线程发出?

python multithreading flask socket.io flask-socketio

5
推荐指数
1
解决办法
2643
查看次数

Flask-SocketIO 无法在 Apache/WSGI 上工作

我使用了http://blog.miguelgrinberg.com/post/easy-websockets-with-flask-and-gevent/page/4中的以下示例代码,当我使用测试服务器运行它时,效果很好,例如python myapp.py我可以连接到它并发送消息

from flask import Flask, render_template
from flask.ext.socketio import SocketIO, emit

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

@app.route('/')
def index():
    return render_template('index.html')

@socketio.on('my event', namespace='/test')
def test_message(message):
    emit('my response', {'data': message['data']})

@socketio.on('my broadcast event', namespace='/test')
def test_message(message):
    emit('my response', {'data': message['data']}, broadcast=True)

@socketio.on('connect', namespace='/test')
def test_connect():
    emit('my response', {'data': 'Connected'})

@socketio.on('disconnect', namespace='/test')
def test_disconnect():
    print('Client disconnected')

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

问题是,当我将相同的代码移动到使用 Apache 为 Flask 提供服务的服务器时,我收到错误。

RuntimeError: You need to use a gevent-socketio …
Run Code Online (Sandbox Code Playgroud)

python apache flask gevent-socketio flask-socketio

5
推荐指数
1
解决办法
5957
查看次数

flask 和 flask-socketio 刷新都发出事件

你如何刷新一个flask-socketio发射事件,以便多条线流到客户端,而不是一次通过多条线?

我正在与 Flask 和 flask-socketIO 合作制作一个网络应用程序,让用户可以与开源国际象棋 AI 下棋,比如 gnuchess 和狡猾。国际象棋 AI 将他们的“思维”作为标准输出打印到服务器终端,但我使用 flask-socketIO 将这种思维发送给用户。

这一切都是设置和工作的,但我遇到的问题是,每一行思维都集中在一个大块中,而不是在 AI 打印时输出每一行。

例如,在与 gnuchess 对战时,服务器打印出这样的想法:

AI thinking: Thinking...
AI thinking: 1 +4 0 2 a5
AI thinking: 1 +9 0 4 b5
AI thinking: 1 +51 0 8 d5
AI thinking: 1 +53 0 21 Nc6
AI thinking: 2 -1 0 47 Nc6 Nc3
AI thinking: 3 +53 0 155 Nc6 Nc3 Nf6
AI thinking: 4 -1 0 613 Nc6 Nf3 Nf6 Nc3
Run Code Online (Sandbox Code Playgroud)

这些行流到我的服务器。在客户端,我发出 AI …

python websocket socket.io flask-socketio

5
推荐指数
2
解决办法
2349
查看次数

使用 Flask-SocketIO 自定义握手数据

我有一个使用 Flask 的 Python 服务器,它有一个使用Flask-SocketIO 的websocket 连接。还有一个类似的问题: 在socket.io中发送自定义数据和handshakeData?我们的想法是做同样的事情,但不使用 Node,而是使用 Flask。我希望客户端在连接事件中发送一些数据,例如:

var socket = io("http://127.0.0.1:3000/", { query: "foo=bar" });
Run Code Online (Sandbox Code Playgroud)

我无法获取自定义数据,并且由于客户端框架的原因我无法依赖 cookie。一个有效的解决方案是像往常一样进行连接事件,然后在自定义事件中将该信息作为有效负载获取。但我们想要的是只需要执行一个连接事件。谢谢!

python sockets flask flask-socketio

5
推荐指数
1
解决办法
4648
查看次数

如何使用Python实时获取大文件的复制进度?

我到处寻找,每次我发现一些看起来很有希望的东西,但都没有成功。

最终我想从 python 内部获取 Linux 机器上文件复制的实时进度。我将利用 Flask-SocketIO 将该进度发送到客户端网页,可能会进行线程化以避免阻塞。

我不介意它是 rsync、复制还是任何其他方式...(shutil 等)来处理实际的副本。我只想要一个钩子来通过套接字推送更新。

到目前为止,我发现这是最有希望的。然而,我不太了解它的控制台打印机制,因为当我尝试将输出打印到文件或只是常规的 Python 打印时,它一次只输出一个字符。

import subprocess
import sys

def copy_with_progress(src, dst):
    cmd = 'rsync --progress --no-inc-recursive %s %s'%(src, dst)
    sub_process = subprocess.Popen(cmd, close_fds=True, shell=True, stdout=subproces.PIPE, stderr=subprocess.PIPE)
    while sub_process.poll() is None:
        out = sub_process.stdout.read(1)
        sys.stdout.write(out)
        sys.stdout.flush()


src = '/home/user/Downloads/large_file.tar'
dst = '/media/usbdrive/large_file.tar'

copy_with_progress(src, dst)
Run Code Online (Sandbox Code Playgroud)

这来自这个问题:Getting realtime output using subprocess

但是,这会通过标准输出报告输出。我想在变量中捕获此输出并发出它。

标准输出进度如下所示,其中一行不断更新:large_file.tar 323,780,608 19% 102.99MB/s 0:00:12 当我打印名为“out”的变量时,我得到一个循环打印到屏幕的单个字符一遍又一遍地换新线。

如何以可用于传输到客户端的方式捕获此信息?

有没有办法在每次刷新状态时抓取整行?

python linux rsync flask-socketio

5
推荐指数
1
解决办法
1602
查看次数

混合内容:https 页面已通过 https 加载,但请求不安全

我正在使用 Nginx + Flask-socketio + aws elb,当在 https 上加载 URL 时,我收到以下错误消息,该消息与 Nginx 和套接字相关,请对此提供帮助,

socket.io.min.js:2 Mixed Content: The page at 'https://localhost/' was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint 'http://localhost/socket.io/1/?t=1477375737508'. This request has been blocked; the content must be served over HTTPS.d.handshake @ socket.io.min.js:2
socket.io.min.js:2 XMLHttpRequest cannot load http://localhost/socket.io/1/?t=1477375737508. Failed to start loading.
Run Code Online (Sandbox Code Playgroud)

nginx flask flask-sockets flask-socketio

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

如何让“python -m flask run”运行主函数?

我正在使用当前启动的烧瓶应用程序,如下所示:

起始命令是python -m flask runFLASK_APP指向哪里__init.py__

__init.py__只需将变量设置app为 的实例Flask

from .app import get_app

app = get_app()

if __name__ == "__main__":
    # do nothing
    pass
Run Code Online (Sandbox Code Playgroud)

在我看来,flask 检测Flask到此模块中set 的全局实例并运行它们,即使我找不到任何关于此的文档。

现在我想集成 Flask-SocketIO,这需要包装烧瓶应用程序并运行套接字实例。从文档来看,我似乎应该能够从 main 运行它:

from .app import get_app

app, sio = get_app() # returns a Flask and a SocketIO instance now

if __name__ == "__main__":
    sio.run(app)
    print("Flask-SocketIO server launched")
Run Code Online (Sandbox Code Playgroud)

但是我从来没有看到预期的输出,而且套接字服务器似乎没有运行。对我来说,这听起来像是 flask 忽略了 main 函数,仍然只是启动Flask它找到的任何实例。

为什么会发生这种情况,即是否有关于此的任何文档?或者,我是否在做 Flask-SocketIO 集成错误?

python flask flask-socketio

5
推荐指数
1
解决办法
6611
查看次数

如何防止值错误:flask socketio 中有效负载中的数据包过多

所以我正在做我的期末项目。我想从客户端网络摄像头获取头部姿势估计。我使用 websocket 成功将网络摄像头传输到服务器。但是当我尝试将头部姿势函数放入套接字路径中时,终端valueError: too many packets in payload经常显示错误。有谁知道如何防止这个错误?任何答案将不胜感激。谢谢 !

这是我的代码以获取更多信息。

JavaScript

var constraints = { audio: false, video: { width: 500, height: 500 } }; 
var video = document.querySelector('video');
var canvas = document.querySelector('canvas');

var socket = io('https://0.0.0.0:8000');

navigator.mediaDevices.getUserMedia(constraints)
    .then(function(mediaStream) {
    video.srcObject = mediaStream;
    video.onloadedmetadata = function(e) {
    video.play();

  };
})
.catch(function(err) { console.log(err.name + ": " + err.message); })

socket.on('connect', function () {
    console.log('connected !', socket.connected);

    function capture() {
        canvas.width = 200;
        canvas.height = 200;
        canvas.getContext('2d').drawImage(video, 0, 0, …
Run Code Online (Sandbox Code Playgroud)

javascript websocket flask-socketio

5
推荐指数
1
解决办法
4487
查看次数

Flask-socketio 断开客户端连接

我正在使用flask-socketio制作一个聊天应用程序,现在我想在客户端断开连接时(即当客户端关闭浏览器/选项卡时)使用客户端的用户名向服务器发送一条消息,以便我可以将该消息从服务器发送到所有现有客户端更改他们的在线好友列表。我已经用谷歌搜索了两个多小时,我所接近的任何东西都是这个这个,但它对我不起作用。我在服务器端通过以下方式在 Flask-socketio 文档中找到了一种方法,但我不知道哪个客户端已断开连接,因此我无法更改在线好友列表。

@socketio.on('disconnect')
def test_disconnect():
    print('Client disconnected')
    emit('client disconnected','a client disconnected but I dont know who',broadcast = True) # i have imported emit 
    # but since i don't know which client disconnected i couldn't emit client name above.
Run Code Online (Sandbox Code Playgroud)

因此,我认为最好从客户端发送消息,如下所示,但在客户端关闭浏览器后,服务器不会收到该消息:

// handle disconnect
socket.on('disconnect',()=>{
      socket.emit('client disconnected',{'username':localStorage.getItem('username')})
})
Run Code Online (Sandbox Code Playgroud)

我是 Flask-socketio 的新手,任何帮助将不胜感激。

flask flask-socketio

5
推荐指数
1
解决办法
9307
查看次数

如何同时使用 eventlet 服务器在 waitress 和 socket.io 上提供 Flask 应用程序?

我正在使用 waitress 服务器来部署 Flask 应用程序进行生产。我还使用flask的socketio以及需要运行自己的应用程序的eventlet服务器。

目前仅向女服务员提供应用程序: serve(app, host='0.0.0.0', port=8080)

如何包含用于运行套接字服务器的 socket.run 命令? socketio.run(app)

我的代码:此代码片段为要在其上运行的 Flask socketio 设置服务器,并且在 if name 部分中,如果处于生产模式,我会在 waitress 上为应用程序提供服务。

应用程序.py

import eventlet
async_mode = None
if async_mode is None:
    try:
        async_mode = 'eventlet'
    except ImportError:
        pass
if async_mode is None:
    async_mode = 'threading'
print('async_mode is ' + async_mode)
if async_mode == 'eventlet':
    eventlet.monkey_patch()
    socketio = socketIO(app,cors_allowed_origins='*',async_mode=async_mode)

if __name__=='__main__':
    if env_mode=='dev':
        app.run(host='0.0.0.0', port=8080)
    elif env_mode=='prod':
        serve(app, host='0.0.0.0', port=8080)
Run Code Online (Sandbox Code Playgroud)

flask eventlet socket.io waitress flask-socketio

5
推荐指数
0
解决办法
1306
查看次数