Я работаю над многоканальным чатом с использованием пользовательских пространств имен согласно 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;
}
});
}