장고 Channels 라이브러리는 consumers.py가 views.py의 역할을 대신한다.
그런데 채팅방에서 닉네임과 시간도 보이게 하고 싶어서 찾아봤다.
링크
Thomas Denzer가 쓴 솔루션대로 해야 한다.
Ken4scholars가 쓴 솔루션대로 하면 self가 user를 가지고 있지 않다는 에러가 뜬다.
import json
from channels.generic.websocket import AsyncWebsocketConsumer
class ChatConsumer(AsyncWebsocketConsumer):
async def connect(self):
self.room_name = self.scope['url_route']['kwargs']['room_name']
self.room_group_name = 'chat_%s' % self.room_name
# Join room group
await self.channel_layer.group_add(
self.room_group_name,
self.channel_name,
)
await self.accept()
async def disconnect(self, close_code):
# Leave room group
await self.channel_layer.group_discard(
self.room_group_name,
self.channel_name,
)
# Receive message from WebSocket
async def receive(self, text_data):
username = self.scope["user"].username
text_data_json = json.loads(text_data)
message = text_data_json['message']
message = (username + ': ' + message)
# Send message to room group
await self.channel_layer.group_send(
self.room_group_name,
{
'type': 'chat_message',
'message': message,
}
)
# Receive message from room group
async def chat_message(self, event):
message = event['message']
username = self.scope["user"].username
# Send message to WebSocket
await self.send(text_data=json.dumps({
'message': message,
'username': username
}))
시간넣는법:
링크
async def receive(self, text_data):
username = self.scope["user"].username
text_data_json = json.loads(text_data)
message = text_data_json['message']
# timestamp = timezone.now().isoformat()
# message = (username + ': ' + message+timestamp)
message = (username + ': ' + message)
# Send message to room group
await self.channel_layer.group_send(
self.room_group_name,
{
'type': 'chat_message',
'message': message,
}
)
# Receive message from room group
async def chat_message(self, event):
message = event['message']
username = self.scope["user"].username
# Send message to WebSocket
await self.send(text_data=json.dumps({
'message': message,
'username': username,
# 'timestamp': timezone.now().isoformat()
}))
주석처리해놓은거 풀면되는데, 저렇게하면 포맷이 좀 지저분하게 나와서 조정해야한다.