Проблема с flask-scoketio. Соединение закрывается еще до подключения
Мучаюсь второй день с настройкой socketio. Вот мои ошибки, ниже я вам предоставлю весь мой код который задействуется и иерархию файлов, я буду очень рад вашей помощи.
websocket.js:43 WebSocket connection to 'ws://85.209.9.38:5000/socket.io/?EIO=4&transport=websocket&sid=LszOolGznDhXIbIJAAA-' failed: socket.io/:1
Failed to load resource: the server responded with a status of 400 (BAD REQUEST)
chat.py
#Импорты
import sqlite3
import os
import logging
from flask import Flask, request, jsonify, g, Blueprint
from flask_socketio import emit
from flask_socketio import join_room
from flask_socketio import SocketIO
from flask_cors import CORS
chat_app = Blueprint('chat',__name__)
CORS(chat_app)
socketio = SocketIO(cors_allowed_origins="*")
# Функция для установки соединения с базой данных
def get_db():
if 'db' not in g:
g.db = {}
g.db['chats'] = sqlite3.connect('chats.db')
g.db['users'] = sqlite3.connect('users.db')
return g.db
# Проверка существования пользователя по его имени
def user_exists(username, db):
cursor = db.cursor()
cursor.execute("SELECT id FROM users WHERE username = ?", (username,))
result = cursor.fetchone()
return result is not None
# API для отправки сообщений
@chat_app.route('/send_message', methods=['POST'])
def send_message():
data = request.get_json()
chat_id = data['chat_id']
sender = data['sender']
message = data['message']
db = get_db()
chats_db = db['chats']
cursor = chats_db.cursor()
if user_exists(sender, db['users']):
# Валидация и сохранение сообщения в базе данных
cursor.execute("INSERT INTO messages (chat_id, sender_username, message_text) VALUES (?, ?, ?)", (chat_id, sender, message))
chats_db.commit()
# Отправляем сообщение через Socket.io
socketio.emit('receive_message', {
'chat_id': chat_id,
'sender': sender,
'message': message
}, room=chat_id)
return jsonify({'status': 'Message sent successfully'})
else:
return jsonify({'error': 'Invalid sender or receiver'})
# API для получения сообщений
@chat_app.route('/get_chat_messages/<int:chat_id>', methods=['GET'])
def get_chat_messages(chat_id):
db = get_db()
cursor = db['chats'].cursor()
cursor.execute("SELECT sender_username, message_text, timestamp FROM messages WHERE chat_id = ? ORDER BY timestamp", (chat_id,))
messages = cursor.fetchall()
return jsonify({'messages': messages})
# Обработчик Socket.io для присоединения к чату
@socketio.on('join_chat')
def join_chat(data):
chat_id = data['chat_id']
join_room(chat_id)
init.py
from flask import Flask
from .chat import chat_app
from .auth import auth_app
from .user_chats import user_chats_app
from flask_cors import CORS
from flask_socketio import SocketIO
import os
app = Flask(__name__)
CORS(app)
secret_key = os.urandom(24)
app.config['SECRET_KEY'] = secret_key
socketio = SocketIO(app,cors_allowed_origins="*",logger=True, engineio_logger=True)
# Регистрируем два приложения (chat и auth) в сервере
app.register_blueprint(chat_app)
app.register_blueprint(auth_app)
app.register_blueprint(user_chats_app)
run.py
from app import app, socketio
if __name__ == '__main__':
socketio.run(app, debug=True)
# Обработчик Socket.io для отправки сообщений
@socketio.on('send_message')
def handle_message(data):
sender = data['sender']
chat_id = data['chat_id']
message = data['message']
emit('receive_message', {'chat_id': chat_id, 'sender': sender, 'message': message},
room=chat_id)
const socket = io("http://85.209.9.38:5000");
new Vue({
el: '#chat',
data: {
message: '',
currentUser: localStorage.getItem('username'),
chatId: localStorage.getItem('chat_id'),
messages: [],
},
methods: {
sendMessage() {
if (this.chatId && this.message) {
socket.emit('send_message', {
sender: this.currentUser,
chat_id: this.chatId,
message: this.message,
});
this.message = '';
}
},
},
created() {
// Пример обработчика события при установке соединения
socket.on('connect', () => {
alert('WebSocket connected');
});
if (this.chatId) {
socket.emit('join_chat', { chat_id: this.chatId });
}
socket.on('receive_message', (data) => {
if (data.chat_id === this.chatId) {
this.messages.push({
sender: data.sender,
message: data.message,
});
}
});
},
});
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="css/style.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script>
</head>
<body>
<div id="app">
<main class="main" id="main">
<div class="sidebar">
<!-- Панель выбора диалога -->
<div class="chat-list">
<div v-for="chat in chats" :key="chat.id" @click="selectChat(chat)">
<div class="chat-item">
<div class="chat-item-foto"></div>
<div class="chat-item-info">
<p class="chat-item-nickname">{{ chat.companion }}</p>
<p class="chat-item-last_message">{{ chat.lastMessage }}</p>
</div>
</div>
</div>
</div>
<div class="sidebar-footer">
<div class="sidebar-footer-container">
<button @click="showCreateChatForm">
<svg width="36" height="36" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_173_301)">
<circle cx="12" cy="11.999" r="9" fill="#1CB0F6" stroke="#1CB0F6" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M12 9V15" stroke="#84D8FF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M9 12H15" stroke="#DDF4FF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_173_301">
<rect width="36" height="36" fill="white"/>
</clipPath>
</defs>
</svg>
</button>
<button id="logout-button" ></button>
<svg width="36" height="36" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_173_542)">
<path d="M9 4.00018H19V18.0002C19 19.1048 18.1046 20.0002 17 20.0002H9" stroke="#EA2B2B" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M15 12.0002H5" stroke="#EA2B2B" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M12 15.0002L15 12.0002L12 9.00018" stroke="#FF4B4B" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_173_542">
<rect width="36" height="36" fill="white"/>
</clipPath>
</defs>
</svg>
</button>
</div>
</div>
</div>
<div class="create-chat-from" v-if="isCreateChatFormVisible">
<form id="create-chat-from" @submit.prevent="createChat">
<input type="text" v-model="companion" placeholder="Введите ник">
<button type="submit">Создать чат</button>
<button @click="cancelCreateChat">Отмена</button>
</form>
<button id="close-form">Закрыть</button>
</div>
<div class="chat" id="chat">
<div class="messages" id="messages">
<!-- Окно чата -->
</div>
<div class="input-container">
<input type="text" v-model="message" placeholder="Введите ваше сообщение">
<button @click="sendMessage">
<svg width="36" height="36" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_173_433)">
<path d="M7.23983 4.53465L19.1842 10.1925C20.7093 10.9149 20.7093 13.0851 19.1842 13.8075L7.23983 19.4653C5.82469 20.1357 4.22297 18.9933 4.39589 17.437L4.97546 12.2209C4.99177 12.0741 4.99177 11.9259 4.97546 11.7791L4.39589 6.56299C4.22297 5.0067 5.82469 3.86433 7.23983 4.53465Z" fill="#1CB0F6" stroke="#1CB0F6" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M7 12H12" stroke="#DDF4FF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_173_433">
<rect width="36" height="36" fill="white"/>
</clipPath>
</defs>
</svg>
</button>
</div>
</div>
</main>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.7.2/socket.io.min.js"></script>
<script src="../js/chat.js"></script>
<script src="../js/user-chats-nav.js"></script>
<!--<script src="../js/main-window.js"></script>-->
</body>
</html>
