Python Can';t访问Flask会话变量作为装饰参数(在Flask SocketIO中)

Python Can';t访问Flask会话变量作为装饰参数(在Flask SocketIO中),python,flask,session-variables,python-decorators,flask-socketio,Python,Flask,Session Variables,Python Decorators,Flask Socketio,根据flask SocketIO的文档,我正在使用自定义名称空间进行多通道聊天。 为了存储通道,我使用了会话变量,这些变量在我的路由/函数中访问时不会出现问题,但在@socketio.on()中,该变量就是不起作用(如果我将名称空间字符串拼写为@socketio.on(“send”,namespace=“/test”)。你知道为什么吗 import os import eventlet import json from flask import Flask, render_template,

根据flask SocketIO的文档,我正在使用自定义名称空间进行多通道聊天。 为了存储通道,我使用了会话变量,这些变量在我的路由/函数中访问时不会出现问题,但在@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;
    }
  });
}

Decorators在导入模块时执行,与实际的处理程序函数不同。在早期,没有正在处理的活动请求,因此没有客户端。由于没有实际的客户端,
会话
没有任何意义

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


有关名称空间的更多信息:

谢谢-我想我会看看房间。是的,房间更灵活,可以动态创建和销毁。