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

问题描述 投票:0回答:1

我正在根据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;
    }
  });
}

我正在根据flask-SocketIO文档使用自定义名称空间进行多通道聊天。为了存储频道,我使用会话变量,这些变量在我的路由/ ...中均无问题。

装饰器在导入模块时执行,这与实际的处理函数不同。在那个早期,没有活动的请求被处理,因此没有客户端。由于没有实际的客户,因此session没有任何意义。
我认为您没有以预期的方式使用名称空间。您实际上不能拥有动态名称空间,必须定义一个离散名称空间列表,然后为所有名称空间实现处理程序。对于大多数应用程序来说,这不是很有用,因此在大多数情况下,整个应用程序只有一个名称空间。
有关名称空间的更多信息:https://socket.io/docs/rooms-and-namespaces/
python flask session-variables python-decorators flask-socketio
1个回答
0
投票
有关名称空间的更多信息:https://socket.io/docs/rooms-and-namespaces/
© www.soinside.com 2019 - 2024. All rights reserved.