Flask-socketio实例不是从外部进程发出的(Django)

时间:2017-03-26 11:33:28

标签: django python-3.x redis socket.io flask-socketio

你好我试图从外部python应用程序(django)发出到flask-socketIO但不幸的是它没有发出。

我已按如下方式定义了我的flask-socket应用程序:

app.register_blueprint(views)
socketio.init_app(app, message_queue='redis://127.0.0.1:6380')

我的观点如下:

from flask import render_template
from .. import socketio
from App import socketio
from App.views import views
from flask_socketio import join_room, leave_room, emit
import cgi


def ack():
    print("cron_failedMsg was delivered")


@socketio.on('connect', namespace='/node/cron')
def ws_conn():
    print("Connected")


@socketio.on('join', namespace='/node/cron')
def on_join(data):
    print("Joined room " + data['room'])
    join_room("room_" + data['room'])
    emit('msg', {'msg': "joined room room_" +
                 data['room']}, room="room_" + data['room'])


@socketio.on('leave', namespace='/node/cron')
def on_leave(data):
    print("leaved")
    leave_room("room_" + data['room'])

@socketio.on('cron_failed', namespace='/node/cron')
def ws_cron_failed(message):
    print("Failed")
    print("sending to room " + message['room'])
    """
    socketio.emit('cron_failed', {
                  'cron_failed': cgi.escape(message['cron_failed'])}, namespace='/node/cron')
    """
    emit('cron_failedMsg', {
        'cron_failed': cgi.escape(message['cron_failed'])}, room="room_" + cgi.escape(message['room']))

从外部python应用程序(Django)发送到消息队列:

from flask_socketio import SocketIO

socketio = SocketIO(message_queue='redis://' +
                            redis6380_conf.redis6380['host'] + ":" + redis6380_conf.redis6380['port'])
        socketio.emit(
            'cron_' + status, {'cron' + status: redisConnection6381.get(str(userID) + '_' + status), 'room': str(userID)}, namespace='/node/cron')

不幸的是它不会从外部python进程中发出。

我使用javascript测试了来自网页的排放,但是没有来自外部python应用程序(Django):

var url = "http://" + document.domain + ":" + location.port;
var socket = io.connect(url + "/node/cron");
socket.emit('join',{room:""+$rootScope.Data.ID});
 socket.emit('cron_failed',{cron_failed:"ddd",room:"3"})

如何从外部python应用程序(Django)发出?从外部流程发出的方式有问题吗?

有关信息,我按照说明操作:https://flask-socketio.readthedocs.io/en/latest/#emitting-from-an-external-process

1 个答案:

答案 0 :(得分:2)

你想从Django进程发射到Flask-SocketIO服务器吗?如果那是你想要做的,那么在Django方面你需要使用Socket.IO客户端。例如,这一个:https://pypi.python.org/pypi/socketIO-client

"从外部进程发出"" Flask-SocketIO的功能与众不同。这个想法是你想要几个服务器进程发送到客户端。此功能允许Django服务器通过Flask-SocketIO服务器发送到客户端。

从您的示例中,您似乎期望Flask-SocketIO服务器中的'cron_failed'事件在您从Django发出时运行,但实际上您正在做的是将该名称的事件发送给客户端。也许你想要的是将事件名称更改为Django发出的'cron_failedMsg'?这似乎是客户所期望的。