Не удается получить доступ к Flask переменным сеанса в качестве аргументов декоратора (в flask -SocketIO) - PullRequest
0 голосов
/ 09 февраля 2020

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

1 Ответ

0 голосов
/ 09 февраля 2020

Декораторы выполняются при импорте модуля, в отличие от фактических функций обработчика. В это раннее время активный запрос не обрабатывается, поэтому клиент отсутствует. Поскольку фактического клиента нет, session не имеет никакого значения.

Я думаю, вы не используете пространства имен ожидаемым образом. Вы не можете иметь динамические пространства имен c, вам нужно определить список отдельных пространств имен, а затем реализовать обработчики для всех из них. Для большинства приложений это не очень полезно, поэтому в большинстве случаев существует единое пространство имен для всего приложения.

Дополнительная информация о пространствах имен: https://socket.io/docs/rooms-and-namespaces/

...