标签: 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
查看次数

重启Supervisor并对FlaskSocketIO产生影响

在我的index.html (HTML/Javascript)身上:

$(document).ready(function(){
        namespace = '/test'; 

        var socket = io.connect('http://' + document.domain + ':' + location.port + namespace);

        socket.on('connect', function() {
            socket.emit('join', {room: 'venue_1'}); 
        });       


        socket.on('my response', function(msg) {
            $('#log').append('<br>Received #' + ': ' + msg.data);
        });       
    });
Run Code Online (Sandbox Code Playgroud)

在我的Server身上:

@socketio.on('connect', namespace='/test')
def test_connect():
    if session.get('venue_id'):
        emit('my response', {'data': 'Connected'})      
        session.pop('venue_id', None)
    else:
        request.namespace.disconnect() 

@socketio.on('join', namespace='/test')
def join(message):
    join_room(message['room'])
    room = message['room']  
    emit('my response', {'data': 'Entered the room ' + message['room']})
Run Code Online (Sandbox Code Playgroud)

登录后,我设置session['venue_id'] = True并移动到index.html …

javascript python flask flask-socketio

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

使用 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万
查看次数

Flask socket.io消息事件在不同的文件中

socketservice.py:

from flask import Flask, render_template
from flask_socketio import SocketIO, emit
from backend.database import db

app = Flask(__name__)
socketio = SocketIO(app, engineio_logger=True)

@socketio.on('connect')
def handle_connection():
    from backend.electionAdministration import syncElections
    syncElections()

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

electionAdministration.py:

from flask_socketio import SocketIO, emit
from bson.json_util import dumps
from backend.socketservice import socketio
from backend.database import db

def syncElections():
    elections = db.elections.find()
    emit('syncElections',dumps(res) , broadcast=True)

@socketio.on('createElection')
def createElection(data):
    db.elections.insert({'title': data["title"]})
    syncElections()
Run Code Online (Sandbox Code Playgroud)

问题是,当createElection事件在文件中时,事件永远不会被调用electionAdministration.py.当我进入它时socketservice.py,它突然起作用.

但我的意思是,我不能将所有内容都放在一个文件中,因为随着应用程序的增长它会变得非常混乱.

python flask-socketio

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

Flask-socketio - 无法设置“Access-Control-Allow-Origin”响应标头

我写了这个简单的flask-socketio代码:

from flask import Flask
from flask_socketio import SocketIO, send

app = Flask(__name__)
app.config['SECRET_KEY'] = 'mysecret'

socketio = SocketIO(app)


@socketio.on('message')
def handle_message(msg):
    print 'Message:' + msg
    send(msg, broadcast=True)


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

当我看到 chrome 网络分析时,我可以看到“Access-Control-Allow-Origin”值为null.

根据Flask-socketio文档:(见API Reference@ http://flask-socketio.readthedocs.io/en/latest/

Parameters:
...
cors_allowed_origins – List of origins that are allowed to connect to this server. All origins are allowed by default.
Run Code Online (Sandbox Code Playgroud)

我在搜索中发现的另一个建议是使用flask-CORS

app.config['SECRET_KEY'] = 'mysecret'
cors = CORS(app)

socketio = SocketIO(app)
Run Code Online (Sandbox Code Playgroud)

我得到相同的结果。 …

python cross-domain flask flask-socketio

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

使用 websocket-client 连接时出现 WinError 10057

我正在制作一个 Flask webapp,我正在使用 Flask-Socketio。由于各种原因,我还需要使用 websocket-client 包。一切都按预期工作,除了当我尝试在不同网络的不同计算机上运行该应用程序时,出现以下错误:

"""
Traceback (most recent call last):
  File "[Path to venv]\venv\lib\site-packages\flask\app.py", line 2449, in wsgi_app
    response = self.handle_exception(e)
  File "[Path to venv]\venv\lib\site-packages\flask\app.py", line 1866, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "[Path to venv]\venv\lib\site-packages\flask\_compat.py", line 39, in reraise
    raise value
  File "[Path to venv]\venv\lib\site-packages\flask\app.py", line 2446, in wsgi_app
    response = self.full_dispatch_request()
  File "[Path to venv]\venv\lib\site-packages\flask\app.py", line 1951, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "[Path to venv]\venv\lib\site-packages\flask\app.py", line 1820, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "[Path to …
Run Code Online (Sandbox Code Playgroud)

python websocket flask python-3.x flask-socketio

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

错误:类 uri 'eventlet' 无效或未找到

我一直在运行一个使用 Celery 运行任务的 dockerized Flask 应用程序。要运行该应用程序,我将 gunicorn 与 eventlet 一起使用,并且使用 alpine linux 发行版运行良好。

但是,由于 sklearn 和其他库的一些问题,我不得不转移到 ubuntu,现在我在运行我的应用程序时遇到了问题。

首先,我收到此错误:

Error: class uri 'eventlet' invalid or not found:

[Traceback (most recent call last):
  File "/myapp/env/lib/python3.6/site-packages/gunicorn/workers/geventlet.py", line 11, in <module>
    import eventlet
ModuleNotFoundError: No module named 'eventlet'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/myapp/env/lib/python3.6/site-packages/gunicorn/util.py", line 135, in load_class
    mod = import_module('.'.join(components))
  File "/usr/lib/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", …
Run Code Online (Sandbox Code Playgroud)

python celery gunicorn docker flask-socketio

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