я пытаюсь создать простое приложение для чата с помощью flask_socketio, и оно не работает должным образом

#python #websocket #socket.io #flask-socketio

Вопрос:

Я пытаюсь создать простое приложение для чата с помощью flask и flask_socketio, и это работает, но обновление WebSocket не происходит, и это дает мне эту ошибку правильно

Транспорт WebSocket недоступен, для его включения необходимо установить сервер WebSocket, совместимый с вашим асинхронным режимом. Подробные сведения см. в документации. (дальнейшие случаи этой ошибки будут регистрироваться с информацией об уровне)

и я видел много учебных пособий и закончил установкой (gunicorn, gevent, eventlet) и обновлением пакетов и библиотеки, но когда я запускаю приложение, оно работает, и сообщение отправляется от клиента на сервер и снова передается всем клиентам, но соединение не websocket, оно объединяется в пул

на стороне сервера

 from flask import Flask, app, render_template, redirect
from flask_socketio import SocketIO



app = Flask(__name__) 
app.config['SECRET_KEY'] = 'test'
socketio = SocketIO(app)



@app.route('/')
def main():
    return render_template('chat.html')


@socketio.on('message')
def message_func(data):

    socketio.send(data)



if __name__ == '__main__':
    socketio.run(app)
 

клиент

 

var socket = io('http://'   document.domain   ':'   location.port);

socket.on('connect', function() {
    console.log('connected');
})

socket.on('message', function(data) {
    const p = document.createElement('p');
    const br = document.createElement('br');
    p.innerHTML = data;
    document.querySelector('#panel').append(p);

})


document.querySelector('#send').onclick = () => {
    socket.send(document.querySelector('#userin').value)
}


 

Комментарии:

1. Что у вас есть в вашем virtualenv? Добавьте вывод pip freeze команды к вопросу. Также укажите команду, которую вы используете для запуска сервера.

Ответ №1:

В документации «Развертывание: веб-сервер Gunicorn» говорится

В документации При использовании gunicorn с gevent worker и поддержкой WebSocket, предоставляемой gevent-websocket, необходимо изменить команду, запускающую сервер, чтобы выбрать пользовательский веб-сервер gevent, поддерживающий протокол WebSocket. Измененная команда является:

 gunicorn -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker -w 1 module:app
 

Для этого вам дополнительно необходимо установить gevent-websocket.