В современном веб-разработке все чаще применяются технологии реального времени, позволяющие обновлять данные без необходимости перезагрузки страницы. Одним из эффективных инструментов для таких задач является WebSockets. В данной статье мы рассмотрим, как создать систему управления расписанием с использованием WebSockets на Python и фронтенда на Vue.js.
Серверная часть на Python
Для реализации сервера WebSockets мы используем библиотеку websockets
и asyncio
. Сервер хранит список занятий и управляет подключениями клиентов. При добавлении, изменении или удалении занятий информация мгновенно отправляется всем подключенным клиентам.
Код сервера (server.py
):
import websockets
import asyncio
import json
schedules = [
{'id': 1, 'subject': 'Математика', 'time': '09:00'},
{'id': 2, 'subject': 'Физика', 'time': '10:30'},
]
clients = set()
async def handler(websocket):
global schedules
clients.add(websocket)
try:
await websocket.send(json.dumps({"action": "init", "schedules": schedules}))
async for message in websocket:
data = json.loads(message)
if data["action"] == "add":
new_id = max([s["id"] for s in schedules] or [0]) + 1
new_schedule = {"id": new_id, "subject": data["subject"], "time": data["time"]}
schedules.append(new_schedule)
elif data["action"] == "update":
for s in schedules:
if s["id"] == data["id"]:
s["subject"] = data["subject"]
s["time"] = data["time"]
elif data["action"] == "delete":
schedules = [s for s in schedules if s["id"] != data["id"]]
response = json.dumps({"action": "update", "schedules": schedules})
await asyncio.gather(*(client.send(response) for client in clients))
except websockets.ConnectionClosed:
pass
finally:
clients.remove(websocket)
async def main():
server = await websockets.serve(handler, 'localhost', 8765)
print('Websockets-сервер запущен')
await server.wait_closed()
asyncio.run(main())
Этот сервер:
- Принимает новые подключения и отправляет актуальное расписание.
- Обрабатывает события добавления, обновления и удаления занятий.
- Оповещает всех подключенных клиентов о изменениях.
Фронтенд на Vue.js
Теперь создадим интерфейс для редактирования расписания с использованием Vue.js. Приложение подключается к серверу WebSockets и динамически обновляет данные.
Код компонента Vue:
<template>
<div>
<h1>Редактирование расписания</h1>
<form @submit.prevent="saveSchedule">
<div v-for="schedule in schedules" :key="schedule.id">
<input v-model="schedule.subject" placeholder="Название предмета" />
<input v-model="schedule.time" placeholder="Время (например, 10:00)" />
<button type="button" @click="deleteLesson(schedule.id)">Удалить</button>
</div>
<button type="button" @click="addLesson">Добавить урок</button>
<button type="submit">Сохранить</button>
</form>
</div>
</template>
<script>
export default {
data() {
return {
schedules: [],
socket: null
};
},
created(){
this.socket = new WebSocket("ws://localhost:8765");
this.socket.onmessage = (event) => {
const data = JSON.parse(event.data);
if(data.action == 'init' || data.action == 'update'){
this.schedules = data.schedules;
}
};
},
methods: {
addLesson() {
this.schedules.push({ id: Date.now(), subject: '', time: '' });
},
deleteLesson(id) {
this.socket.send(JSON.stringify({ action: 'delete', id }));
},
saveSchedule() {
this.schedules.forEach(schedule => {
this.socket.send(JSON.stringify({ action: 'update', ...schedule }));
});
}
}
};
</script>
Как это работает?
- При загрузке страницы клиент подключается к WebSocket-серверу.
- Получает актуальный список занятий.
- Позволяет добавлять, изменять и удалять занятия.
- Изменения автоматически синхронизируются между всеми пользователями.
Запуск проекта
- Установите зависимости Python:
pip install websockets
. - Запустите сервер командой:
python server.py
. - Разместите Vue-код в файле
App.vue
и откройте страницу в браузере.
Заключение
Использование WebSockets в сочетании с Vue.js позволяет создать удобные и динамичные веб-приложения, работающие в режиме реального времени. Этот подход отлично подходит для расписаний, чатов, уведомлений и других интерактивных решений.
Автор: Евгений Морковин
0 комментариев