Python pywebio проблема с отображением в реальном времени
в этом коде я хочу сделать чтобы сообщения показывались в реальном времени и не надо было перезагружать страницу каждый раз дабы загрузить сообщения из json, уже всё перепробовал и с WebSocket но ничего не получается, если кто то поможет буду благодарен!
import asyncio
import json
from pywebio import start_server
from pywebio.input import *
from pywebio.output import *
# Загрузка существующих групп из JSON-файла (если он существует)
try:
with open('groups.json', 'r') as f:
chat_msgs = json.load(f)
except FileNotFoundError:
chat_msgs = {}
online_users = set()
MAX_MESSAGES_COUNT = 100
async def main():
put_markdown("## ? Добро пожаловать в онлайн чат!")
# Вход в группу или выбор существующей
group_names = list(chat_msgs.keys())
group_action = await select("Выберите действие:", options=["Войти в существующую группу"] + ["Создать новую группу"] * (not group_names))
if group_action == "Войти в существующую группу":
group_name = await select("Выберите группу", options=group_names)
else:
group_name = await input("Создать новую группу", placeholder="Имя группы", validate=lambda n: "Такая группа уже существует!" if n in chat_msgs else None)
chat_msgs[group_name] = [] # Создание новой группы
msg_box = output()
put_scrollable(msg_box, height=300, keep_bottom=True)
nickname = await input("Войти в чат", required=True, placeholder="Ваше имя", validate=lambda n: "Такой ник уже используется!" if n in online_users else None)
online_users.add(nickname)
if not chat_msgs[group_name]:
# Записать название группы по первому сообщению
chat_msgs[group_name].append(('?', f'`{nickname}` вошел в группу {group_name}!'))
msg_box.append(put_markdown(f'? `{nickname}` вошел в группу {group_name}!'))
# Отображение всей истории переписки из JSON
for message in chat_msgs[group_name]:
if message[0] != '?': # Не отображать системные сообщения
msg_box.append(put_markdown(f"`{message[0]}`: {message[1]}"))
async def message_updater():
while True:
await asyncio.sleep(1) # Обновление сообщений каждую секунду
new_messages = chat_msgs.get(group_name, [])
for i in range(len(msg_box.children), len(new_messages)):
message = new_messages[i]
if message[0] != '?': # Не отображать системные сообщения
msg_box.append(put_markdown(f"`{message[0]}`: {message[1]}"))
asyncio.ensure_future(message_updater())
while True:
data = await input_group("? Новое сообщение", [
input(placeholder="Текст сообщения ...", name="msg"),
actions(name="cmd", buttons=["Отправить", {'label': "Выйти из чата", 'type': 'cancel', 'onclick': 'window.location.reload()'}])
], validate = lambda m: ('msg', "Введите текст сообщения!") if m["cmd"] == "Отправить" and not m['msg'] else None)
if data is None:
break
msg_box.append(put_markdown(f"`{nickname}`: {data['msg']}"))
chat_msgs[group_name].append((nickname, data['msg']))
online_users.remove(nickname)
toast("Вы вышли из чата!")
msg_box.append(put_markdown(f'? Пользователь `{nickname}` покинул группу {group_name}!'))
chat_msgs[group_name].append(('?', f'Пользователь `{nickname}` покинул группу {group_name}!'))
# Сохранение групп в JSON-файл
with open('groups.json', 'w') as f:
json.dump(chat_msgs, f)
if __name__ == "__main__":
start_server(main, debug=True, port=8080, cdn=False)