Flask SocketIO неправильно отправляет тип события на вызове emit - PullRequest
0 голосов
/ 24 апреля 2020

У меня проблемы с получением клиентом socket.io правильного получения сообщения с пользовательским типом события с моего сервера.

Я отправляю запрос на получение идентификатора пользователя клиента с моего сервера, когда клиент успешно подключается После трудностей при попытке использовать сеансы между HTTP-запросами и WebSockets я переключился на передачу идентификатора пользователя через шаблонизацию с помощью jinja.

Однако сейчас у меня возникают проблемы с получением клиентом пакета от пользовательского типа от сервер.

controller.py

@socketio.on('connect')
def connect():
    hello = 'Hello'
    emit('get_user', hello, include_self=True)
    socketio.sleep(0)
    return

index. html*

<script>
const socket = io(SERVER_URL/PATH);

socket.on("get_user", function (data) {
    console.log(data);
    socket.emit("send_user", {{ user.id }});
</script>

Сервер показывает, что оно «испускает» сообщение с правильным типом, но затем сразу после того, как оно отправляет его в виде сообщения.

Регистрация сервера терминала

Затем клиент получает только отправленное сообщение типа "message" вместо типа "get_user"

Регистрация клиентских сокетов

Вопрос: Как я могу заставить emit работать правильно ?

Любая помощь будет принята с благодарностью. Спасибо!

Редактировать: Отправка оставшейся части кода.

controllers.py

# Import flask dependencies
from flask import Blueprint, request, render_template, flash, g, session, redirect, url_for
from flask_socketio import send, emit

# Import the database class for the app
from app import db, socketio

# Import module models
from app.mod_auth.models import User, Socket
from app.mod_home.models import Topic

# Define blueprint for home and set the url prefix
mod_home = Blueprint("home", __name__, url_prefix='/home')

@mod_home.route('/', methods=['GET'])
def home():
    print('-----route------\n%r\n-------------------' % session['user_id'])
    # check if user is logged in
    if (not 'user_id' in session) or (session['user_id'] == None):
        return redirect(url_for('auth.signin'))

    user_id = session['user_id']

    # Use the user id to retreive the user's friends list
    user = User.query.get(user_id)
    friends = user.friends.all()

    # Use the user id to retreive the chats that they belong to

    # Retreive a list of the top topics show first 10

    return render_template("home/homepage.html", user=user, friends=friends)

@socketio.on('connect')
def connect():
    # Reply back to client that connection was successful
    hello = 'Hello'
    emit('get_user', hello,
        include_self=True)
    socketio.sleep(0)
    return

@socketio.on('send_user')
def register_user(user):
    print(user)

    # user_id = session['user_id']
    # socket_id = request.sid
    #
    # # Create socket entry
    # socket = Socket(user_id, socket_id)
    #
    # # Add and Commit socket entry
    # db.session.add(socket)
    # db.session.commit()

домашняя страница. html

<head>
  <title>Home Page</title>
  <link href="https://fonts.googleapis.com/css2?family=Roboto&display=swap" rel="stylesheet">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.3.0/socket.io.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"></script>
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
</head>
<body>
...
<script type="text/javascript" charset="utf-8">
    $(function () {
    const socket = io('http://127.0.0.1:5000/home');

    socket.on("get_user", function (data) {
      console.log("received connection_succeeded");
      console.log(data);
      socket.emit("send_user", {{ user.id }});
    });
  });
  </script>
</body>

1 Ответ

0 голосов
/ 25 апреля 2020

Проблема в том, что вы смешиваете разные пространства имен.

Когда ваш клиент подключается, он запрашивает пространство имен /home (не путайте пространство имен Socket.IO с префиксом URL, ничего общего с друг с другом, кроме того, что оба /home). При каждом подключении пространства имен подключается также пространство имен по умолчанию /. К сожалению, это создает некоторую путаницу, и именно это и вызывает вашу проблему.

На вашем сервере есть обработчик событий подключения для /, но не для /home. Поскольку вы обрабатываете соединение на /, emit() также отключается на /. Однако ваш клиент будет обрабатывать события только для /home, поскольку именно так вы установили соединение.

Решение состоит в том, чтобы везде использовать одно и то же пространство имен. Если вам нужен мой совет, я видел, как люди так много путешествовали по пространствам имен, что в эти дни я предпочитаю работать с пространством имен по умолчанию. Поэтому измените URL своего подключения на http://127.0.0.1:5000/, и тогда я думаю, что у вас все будет в порядке.

...