Django Channels wnosi do Django obsługę WebSocket, a Pytigon opakowuje ją czystym, opartym na konwencjach interfejsem. Definiuj konsumentów, łącz się z pokojami i wysyłaj aktualizacje w czasie rzeczywistym — wszystko bez wychodzenia z ekosystemu Pytigona.
Utwórz plik consumers.py w katalogu aplikacji. Pytigon wykryje go automatycznie:
# [app_name]/consumers.py
from pytigon_lib.schdjangoext.channels_utils import PtigJsonWebsocketConsumer
class MyConsumer(PtigJsonWebsocketConsumer):
def connect(self):
# Wywoływane przy ustanowieniu połączenia WebSocket
self.room_group_name = "my_room"
self.accept()
def receive_json(self, content):
# Wywoływane po nadejściu danych JSON od klienta
action = content.get("action")
if action == "ping":
self.send_json({"action": "pong"})
def table_update(self, event):
# Wywoływane po otrzymaniu zdarzenia aktualizacji tabeli
self.send_json(event["data"])
Użyj systemu warstw Django Channels, by rozgłaszać do grup:
from channels.layers import get_channel_layer
from asgiref.sync import async_to_sync
def notify_table_change(table_name, record_id):
channel_layer = get_channel_layer()
async_to_sync(channel_layer.group_send)(
f"table_{table_name}",
{
"type": "table_update",
"data": {"table": table_name, "id": record_id}
}
)
Biblioteka JavaScript Pytigona automatycznie obsługuje połączenia WebSocket:
// Połączenie jest ustanawiane automatycznie
// Nasłuchuj zdarzeń wysyłanych przez serwer
ptig.socket.on('table_update', function(data) {
if (data.table === 'MyTable') {
ptig.table.refresh();
}
});
// Wyślij dane do serwera
ptig.socket.send({
action: 'subscribe',
table: 'MyTable',
filter: 'active'
});
W środowisku produkcyjnym skonfiguruj Redis jako backend warstwy kanałów:
# settings_app.py
CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels_redis.core.RedisChannelLayer",
"CONFIG": {
"hosts": [("127.0.0.1", 6379)],
},
},
}
W trybie deweloperskim warstwa w pamięci działa bez zewnętrznych zależności.