我想向套接字客户端发出延迟消息。例如,当一个新客户端连接时,应该向客户端发出“检查开始”消息,并且在特定秒后应该从线程发出另一条消息。
@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)
是否可以从线程发出?
我使用了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) 在我的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 …
我有一个使用 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 内部获取 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”的变量时,我得到一个循环打印到屏幕的单个字符一遍又一遍地换新线。
如何以可用于传输到客户端的方式捕获此信息?
有没有办法在每次刷新状态时抓取整行?
我正在使用 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) 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,它突然起作用.
但我的意思是,我不能将所有内容都放在一个文件中,因为随着应用程序的增长它会变得非常混乱.
我写了这个简单的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)
我得到相同的结果。 …
我正在制作一个 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) 我一直在运行一个使用 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) flask-socketio ×10
python ×9
flask ×7
apache ×1
celery ×1
cross-domain ×1
docker ×1
gunicorn ×1
javascript ×1
linux ×1
nginx ×1
python-3.x ×1
rsync ×1
socket.io ×1
sockets ×1
websocket ×1