无法访问 Flask 会话变量作为装饰器参数(在 flask-SocketIO 中)

Can't access Flask session variables as decorator arguments (in flask-SocketIO)

我正在根据 flask-SocketIO 文档使用自定义命名空间进行多通道聊天。 为了存储频道,我使用了会话变量,这些变量在我的 routes/functions 中可以毫无问题地访问,但是在 @socketio.on() 中,该变量不起作用(如果我拼写命名空间,它就可以正常工作-字符串为@socketio.on("send", namespace = "/test")。有什么想法吗???

import os
import eventlet
import json

from flask import Flask, render_template, request, jsonify, session
from flask_session import Session
from tempfile import mkdtemp
from flask_socketio import SocketIO, emit, Namespace

app = Flask(__name__)
app.config["SECRET_KEY"] = os.getenv("SECRET_KEY")

app.config["SESSION_FILE_DIR"] = mkdtemp()
app.config["SESSION_PERMANENT"] = False
app.config["SESSION_TYPE"] = "filesystem"
Session(app) 

socketio = SocketIO(app, logger=True, engineio_logger=True)

channels = []
messagetext = None

# [OTHER FUNCTIONS SETTING session["namespace"] ]


@socketio.on("send", namespace = session["namespace"])
def handle_send(data): 
  messagetext = data["message"]
  print("THE MESSAGE IS :"+messagetext)
  emit("broadcast message", {"message": messagetext}, broadcast = True)


if __name__ == '__main__':
  socketio.run(app, debug=True)


这是客户端 JavaScript 片段,以防相关:

function connectSocket(channel) {

  var socket = io(`/${channel}`);
  socket.on('connect', () => {
    document.querySelector('#current_channel').innerHTML = channel;
    document.querySelector('#send_message').onsubmit = () => {
      var message = document.querySelector('#message').value;
      console.log(`MESSAGE IS ${message}`);
      socket.emit('send', {'message': message}); 
      return false;
    }
  });
}

装饰器在导入模块时执行,这与实际的处理函数不同。在那个早期没有正在处理的活动请求,因此没有客户端。由于没有实际客户,session没有任何意义。

我认为您没有以预期的方式使用命名空间。您不能真正拥有动态命名空间,您必须定义一个离散命名空间列表,然后为所有这些命名空间实现处理程序。对于大多数应用程序,这不是很有用,因此在大多数情况下,整个应用程序只有一个命名空间。

有关命名空间的更多信息:https://socket.io/docs/rooms-and-namespaces/