使用 flask-socketIO 作为通知处理程序(服务器-客户端)连接

useing flask-socketIO as a Notification Handler (server-client ) connection

我是 socketIO 的新手,我正在尝试使用它构建一个通知系统。

它在 flask-socketIO Official website link 上说这是可能的并且已经准备好了。但出于某种原因,我一直收到错误

AttributeError: 'Request' object has no attribute 'namespace'

pythonApp.py

@app.route("/ajaxHandler", methods=['post'])
def ajaxHandler(userSessionId):

    if request.method == 'POST':
        data = request.get_json()
        print(f'\n\n >> data: {data}\n\n')
        notify_User({'test':'test1'},userSessionId) # >>>> Notice 1 

    return jsonify({'Ajax': 'completed'})

@socketio.on('notify_User' , namespace='/notifications/')
def notify_User(data,sid):
msg= {"hi": hello}
    emit('notify_User',msg, room=sid) # >>> Notice 2

Notice 1: I could pull userSessionId from database but for the sake of this example i'm pullingit from the user

Notice 2 : the error is generated from this line

socket_Io.js

document.addEventListener('DOMContentLoaded', () => {

   // Connect to websocket
   var socket = io.connect(location.protocol + '//' + document.domain + ':' + location.port);

   var socket = io();

    socket.on("notify_User",(data) => {

        console.log(`i got this : ${data}`)
    });

我一直在到处寻找错误,但找不到任何对我的情况有帮助的答案。

notify_User() 定义为 Socket.IO 事件处理程序。当客户端发出 notify_User 事件时,此函数将自动 运行。

您正在 ajaxHandler() 视图函数中直接调用此函数。这不是正确的用法,不应从服务器调用 Socket.IO 事件处理程序,客户端在发出 Socket.IO 事件时触发此函数。

如果您想从 ajaxHandler() 路由向客户端发送事件,请使用 emit() 函数来执行此操作。因为这是 HTTP 路由而不是 Socket.IO 事件,所以您需要提供一些在 Socket.IO 连接之外不可用的信息。因此,在 Socket.IO 处理程序之外使用 emit() 时需要 namespacesid 参数。