WIP: Draft: Resolve "Chat App Websocket Tutorial" #174
3
.gitignore
vendored
3
.gitignore
vendored
@@ -2,4 +2,5 @@ __pycache__
|
|||||||
.venv
|
.venv
|
||||||
db.sqlite3
|
db.sqlite3
|
||||||
tailwindcss.exe
|
tailwindcss.exe
|
||||||
t-style.css
|
t-style.css
|
||||||
|
dump.rdb
|
||||||
|
|||||||
@@ -1,18 +1,40 @@
|
|||||||
# chat/consumers.py
|
|
||||||
import json
|
import json
|
||||||
|
|
||||||
|
from asgiref.sync import async_to_sync
|
||||||
from channels.generic.websocket import WebsocketConsumer
|
from channels.generic.websocket import WebsocketConsumer
|
||||||
|
|
||||||
|
|
||||||
class ChatConsumer(WebsocketConsumer):
|
class ChatConsumer(WebsocketConsumer):
|
||||||
def connect(self):
|
def connect(self):
|
||||||
|
self.room_name = self.scope["url_route"]["kwargs"]["room_name"]
|
||||||
|
self.room_group_name = f"chat_{self.room_name}"
|
||||||
|
|
||||||
|
# Join room group
|
||||||
|
async_to_sync(self.channel_layer.group_add)(
|
||||||
|
self.room_group_name, self.channel_name
|
||||||
|
)
|
||||||
|
|
||||||
self.accept()
|
self.accept()
|
||||||
|
|
||||||
def disconnect(self, close_code):
|
def disconnect(self, close_code):
|
||||||
pass
|
# Leave room group
|
||||||
|
async_to_sync(self.channel_layer.group_discard)(
|
||||||
|
self.room_group_name, self.channel_name
|
||||||
|
)
|
||||||
|
|
||||||
|
# Receive message from WebSocket
|
||||||
def receive(self, text_data):
|
def receive(self, text_data):
|
||||||
text_data_json = json.loads(text_data)
|
text_data_json = json.loads(text_data)
|
||||||
message = text_data_json["message"]
|
message = text_data_json["message"]
|
||||||
|
|
||||||
|
# Send message to room group
|
||||||
|
async_to_sync(self.channel_layer.group_send)(
|
||||||
|
self.room_group_name, {"type": "chat.message", "message": message}
|
||||||
|
)
|
||||||
|
|
||||||
|
# Receive message from room group
|
||||||
|
def chat_message(self, event):
|
||||||
|
message = event["message"]
|
||||||
|
|
||||||
|
# Send message to WebSocket
|
||||||
self.send(text_data=json.dumps({"message": message}))
|
self.send(text_data=json.dumps({"message": message}))
|
||||||
@@ -133,4 +133,15 @@ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
|||||||
LOGIN_URL = '/account/login/'
|
LOGIN_URL = '/account/login/'
|
||||||
|
|
||||||
# Daphne
|
# Daphne
|
||||||
ASGI_APPLICATION = "core.asgi.application"
|
ASGI_APPLICATION = "core.asgi.application"
|
||||||
|
|
||||||
|
# Channels
|
||||||
|
ASGI_APPLICATION = "core.asgi.application"
|
||||||
|
CHANNEL_LAYERS = {
|
||||||
|
"default": {
|
||||||
|
"BACKEND": "channels_redis.core.RedisChannelLayer",
|
||||||
|
"CONFIG": {
|
||||||
|
"hosts": [("127.0.0.1", 6379)],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
django~=5.1.4
|
django~=5.1.4
|
||||||
channels~=4.2.0
|
channels~=4.2.0
|
||||||
daphne~=4.1.2
|
daphne~=4.1.2
|
||||||
|
channels_redis
|
||||||
Reference in New Issue
Block a user