#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.