Я работаю над сайтом чата с Python Flask, Flask socket.io и базой данных Heroku PostgreSQL.Когда сообщение отправляется из Javascript в мой файл Python, я хочу сохранить это сообщение в своей базе данных, а затем отправить сообщение клиентам.Без сохраняющей части, испущенное сообщение появляется очень быстро, как и ожидалось.Но когда я закодировал в части «Вставить в базу данных», отправленное сообщение занимает не менее 3 секунд, прежде чем появится в браузере.Поэтому я предполагаю, что это проблема производительности базы данных.Есть ли способ сделать этот процесс быстрее?Могу ли я как-то разрешить отправку сообщения и сначала его просмотреть пользователю, а затем выполнить вставку?
Я использую SQLAlchemy ORM в качестве способа вставки сообщения в базу данных.Я пытался использовать обычную командную строку SQL, но это не дает существенных изменений.
Python-код (сервер):
@socketio.on("submit message")
def socket_message(data):
user_id = session["user_id"]
rows = User.query.get(user_id)
display_name_user = rows.display_name
now = datetime.datetime.now()
currentDT = now.strftime('%Y-%m-%d %H:%M:%S')
msg = data["msg"]
add_chat = Chat(display_name=display_name_user, messages=msg, time=currentDT)
db.session.add(add_chat)
db.session.commit()
emit("announce message", {"msg": msg, "display_name_user": display_name_user}, broadcast=True)
Javascript:
// Listen to events within the page
document.addEventListener('DOMContentLoaded', () => {
// Connect to websocket
var socket = io.connect(location.protocol + '//' + document.domain + ':' + location.port);
// When connected, start the process to emit the message when input is given
socket.on('connect', () => {
// When the user press Enter in the input box, link this to a button click
document.querySelector('#input-message').addEventListener('keyup', function(event) {
if (event.keyCode === 13) {
event.preventDefault();
// Linking pressing Enter with button being clicked
document.querySelector('#message-button').click();
};
});
// When button is clicked, emit the message
document.querySelector('#message-button').onclick = () => {
const msg = document.getElementById('input-message').value;
socket.emit('submit message', {'msg': msg});
// Clear the input field
document.getElementById('input-message').value = ""
}
});
// When a new message is announced, broadcast it to all computers in the channel
socket.on('announce message', data => {
// Append new message to message list
const header = document.createElement('header')
header.innerHTML = data.display_name_user
const li = document.createElement('li');
li.innerHTML = data.msg;
const hr = document.createElement('hr');
var message_list = document.querySelector('#message-list');
message_list.append(header);
message_list.append(li);
message_list.append(hr);
// Scroll to bottom of page when a new message appears
var message_box = document.querySelector('.message-box');
message_box.scrollTop = message_box.scrollHeight;
});
});
I need the message to be emitted within 1 second maximum.