Найти Π² Π”Π·Π΅Π½Π΅
Анастасия Π‘ΠΎΡ„Ρ‚

πŸ’¬ Мини-Ρ‡Π°Ρ‚ Π½Π° Flask + WebSocket: Π΄Π΅Π»Π°Π΅ΠΌ свой Slack Π½Π° ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΠΊΠ°Ρ…

«Нам Π±Ρ‹ Ρ‡Π°Ρ‚, Π½ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Π΅Π· ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° зависимостСй ΠΈ запускался ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ питоновский скрипт.Β»
β€” всС ΠΌΡ‹ ΠΊΠΎΠ³Π΄Π°-Ρ‚ΠΎ БСгодня ΠΌΡ‹ создадим Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠΈΠ½ΠΈ-Ρ‡Π°Ρ‚, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Flask ΠΈ WebSocket Ρ‡Π΅Ρ€Π΅Π· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Flask-SocketIO. НС ΠΏΡƒΠ³Π°ΠΉΡ‚Π΅ΡΡŒ, Ссли Π²Ρ‹ Π½ΠΎΠ²ΠΈΡ‡ΠΎΠΊ β€” объясню ΠΊΠ°ΠΆΠ΄ΡƒΡŽ строчку, Π° Ссли Π²Ρ‹ ΠΎΠΏΡ‹Ρ‚Π½Ρ‹ΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ β€” Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡƒΡ‚Π°Ρ‰ΠΈΡ‚Π΅ сСбС идСю для быстрого MVP ΠΈΠ»ΠΈ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ инструмСнта. pip install flask flask-socketio Flask сам ΠΏΠΎ сСбС Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚ Π² «настоящСС врСмя». Π’ΠΎ Π΅ΡΡ‚ΡŒ, Π±Π΅Π· обновлСния страницы Π²Ρ‹ Π½Π΅ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ написал сообщСниС. WebSocket позволяСт Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ΅ соСдинСниС ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ сСрвСром ΠΈ Β«Ρ‚ΠΎΠ»ΠΊΠ°Ρ‚ΡŒΒ» Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΠ³Π΄Π° Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ происходит. mini-chat/
β”œβ”€β”€ app.py
└── templates/
└── chat.html from flask import Flask, render_template
from flask_socketio import SocketIO, send
# Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ Flask-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
app = Flask(__name__)
app.config['SECRET_KEY'] = 'super-secret-key' # Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π» SocketIO
# ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ SocketIO
socketio = SocketIO(app)
# Π ΠΎΡƒΡ‚ Π³Π»Π°Π²Π½ΠΎΠΉ страницы
@app.route('/
ОглавлСниС
Flask + WebSocket
Flask + WebSocket

«Нам Π±Ρ‹ Ρ‡Π°Ρ‚, Π½ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±Π΅Π· ΠΌΠΈΠ»Π»ΠΈΠΎΠ½Π° зависимостСй ΠΈ запускался ΠΊΠ°ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ питоновский скрипт.Β»

β€” всС ΠΌΡ‹ ΠΊΠΎΠ³Π΄Π°-Ρ‚ΠΎ

БСгодня ΠΌΡ‹ создадим Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠΈΠ½ΠΈ-Ρ‡Π°Ρ‚, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Flask ΠΈ WebSocket Ρ‡Π΅Ρ€Π΅Π· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Flask-SocketIO. НС ΠΏΡƒΠ³Π°ΠΉΡ‚Π΅ΡΡŒ, Ссли Π²Ρ‹ Π½ΠΎΠ²ΠΈΡ‡ΠΎΠΊ β€” объясню ΠΊΠ°ΠΆΠ΄ΡƒΡŽ строчку, Π° Ссли Π²Ρ‹ ΠΎΠΏΡ‹Ρ‚Π½Ρ‹ΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ β€” Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡƒΡ‚Π°Ρ‰ΠΈΡ‚Π΅ сСбС идСю для быстрого MVP ΠΈΠ»ΠΈ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π³ΠΎ инструмСнта.

πŸ›  Π§Ρ‚ΠΎ Π±ΡƒΠ΄Π΅ΠΌ Π΄Π΅Π»Π°Ρ‚ΡŒ?

  • Мини-сСрвСр Π½Π° Flask
  • WebSocket-соСдинСниС (настоящий real-time)
  • ΠŸΡ€ΠΎΡΡ‚Π°Ρ HTML-страница с ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ
  • ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° сообщСний ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Ρƒ всСх ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ

πŸ“¦ Установка зависимостСй

pip install flask flask-socketio

🧠 ΠŸΠΎΡ‡Π΅ΠΌΡƒ WebSocket?

Flask сам ΠΏΠΎ сСбС Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚ Π² «настоящСС врСмя». Π’ΠΎ Π΅ΡΡ‚ΡŒ, Π±Π΅Π· обновлСния страницы Π²Ρ‹ Π½Π΅ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ написал сообщСниС. WebSocket позволяСт Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ΅ соСдинСниС ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ сСрвСром ΠΈ Β«Ρ‚ΠΎΠ»ΠΊΠ°Ρ‚ΡŒΒ» Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΠ³Π΄Π° Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ происходит.

πŸ“ Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

mini-chat/
β”œβ”€β”€ app.py
└── templates/
└── chat.html

🧾 Код: app.py

from flask import Flask, render_template
from flask_socketio import SocketIO, send

# Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ Flask-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
app = Flask(__name__)
app.config['SECRET_KEY'] = 'super-secret-key' # Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Π» SocketIO

# ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ SocketIO
socketio = SocketIO(app)

# Π ΠΎΡƒΡ‚ Π³Π»Π°Π²Π½ΠΎΠΉ страницы
@app.route('/')
def index():
return render_template('chat.html') # HTML-страница с Ρ‡Π°Ρ‚ΠΎΠΌ

# ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ входящих сообщСний ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°
@socketio.on('message')
def handle_message(msg):
print('НовоС сообщСниС: ' + msg)
send(msg, broadcast=True) # ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌ сообщСниС всСм

# Запуск прилоТСния
if __name__ == '__main__':
socketio.run(app, debug=True)

πŸ” ПояснСния

  • send(msg, broadcast=True) β€” рассылаСт сообщСниС всСм ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½Ρ‹ΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ
  • @socketio.on('message') β€” ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ события WebSocket ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ
  • debug=True β€” Flask сам пСрСзапускаСтся ΠΏΡ€ΠΈ измСнСниях

🌐 HTML: templates/chat.html

<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Мини-Ρ‡Π°Ρ‚</title>
<script src="https://cdn.socket.io/4.0.0/socket.io.min.js"></script>
<style>
body { font-family: sans-serif; padding: 30px; }
#messages { border: 1px solid #ddd; padding: 10px; height: 200px; overflow-y: scroll; margin-bottom: 10px; }
</style>
</head>
<body>

<h2>πŸ’¬ Π”ΠΎΠ±Ρ€ΠΎ ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΌΠΈΠ½ΠΈ-Ρ‡Π°Ρ‚!</h2>

<div id="messages"></div>

<input type="text" id="message" placeholder="Π’Π²Π΅Π΄ΠΈΡ‚Π΅ сообщСниС..." autofocus>
<button onclick="sendMessage()">ΠžΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ</button>

<script>
const socket = io(); // ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡΡ ΠΊ сСрвСру

// ΠŸΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ сообщСния β€” добавляСм Π΅Π³ΠΎ Π² div
socket.on('message', function(msg) {
const messages = document.getElementById('messages');
const newMsg = document.createElement('div');
newMsg.textContent = msg;
messages.appendChild(newMsg);
messages.scrollTop = messages.scrollHeight; // скроллим Π²Π½ΠΈΠ·
});

// ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° сообщСния Π½Π° сСрвСр
function sendMessage() {
const input = document.getElementById('message');
const msg = input.value;
if (msg.trim()) {
socket.send(msg); // ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° сообщСния
input.value = '';
}
}

// Enter Π½Π°ΠΆΠ°Π»ΠΈ? ΠžΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ!
document.getElementById('message').addEventListener('keyup', function(e) {
if (e.key === 'Enter') sendMessage();
});
</script>

</body>
</html>

πŸ§ͺ ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°

  1. ЗапускаСм python app.py
  2. ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ Π½Π° http://localhost:5000
  3. ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Π²Ρ‚ΠΎΡ€ΡƒΡŽ Π²ΠΊΠ»Π°Π΄ΠΊΡƒ β€” ΠΈ Π²ΠΈΠ΄ΠΈΠΌ магию: сообщСния ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ πŸ”₯

πŸ€” Π§Ρ‚ΠΎ ΠΌΡ‹ сдСлали?

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π§Ρ‚ΠΎ ΠΎΠ½ Π΄Π΅Π»Π°Π΅Ρ‚FlaskΠ ΠΎΡƒΡ‚ΠΈΠ½Π³ ΠΈ запуск Π²Π΅Π±-сСрвСраSocketIOWebSocket-соСдинСниС ΠΈ событияchat.htmlΠ˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ, взаимодСйствиС с сСрвСромbroadcastРассылка сообщСний всСм ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ

πŸ”§ Π§Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ?

  • Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΈΠΊΠ½Π΅ΠΉΠΌΡ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ
  • Π Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ Ρ‡Π°Ρ‚-ΠΊΠΎΠΌΠ½Π°Ρ‚Ρ‹
  • Π₯Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ сообщСний (Π² Π‘Π”)
  • Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡŽ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Π΅Ρ€Π΅Π· Flask-Login)
  • Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ Π΄ΠΈΠ·Π°ΠΉΠ½ Π² стилС Telegram 😎

πŸ’‘ ИдСя Π½Π° вырост

МоТно ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ этот Ρ‡Π°Ρ‚ Π²:

  • ΠŸΠΎΠΌΠΎΡ‰Π½ΠΈΠΊΠ° для сайта (Ρ‡Π°Ρ‚ с ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠΌ)
  • Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΡŽΡŽ систСму ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ
  • Мини-Ρ‡Π°Ρ‚ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ стартапа Π±Π΅Π· Slack

🏁 Π˜Ρ‚ΠΎΠ³

ΠœΡ‹ создали Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ Π²Π΅Π±-Ρ‡Π°Ρ‚ Π½Π° Python с WebSocket. Использовали всСго ΠΏΠ°Ρ€Ρƒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ HTML. Чисто, просто ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.