π Channelsλ₯Ό μ΄μ©νμ¬ μ¬μ©μ μΌλμΌ μ±ν κΈ°λ₯μ ꡬννμλλ° λ§λ μλλ μ€λ₯μμ μκ°μ λ무 λ§μ΄ μ¨ νΉμ λͺ°λΌ λμ μ¬ λ³Έλ€. μΌλμΌ μ±ν μ κΈ°λ₯μ λͺ¨λ ꡬνν ν μλ‘ λ°©μ λ§λ€κ³ μ±λ λ μ΄μ΄μμ μ±ν μ μ‘κΉμ§ ν μ€νΈλ₯Ό νμΈνμμΌλ DB μ μ₯ λ‘μ§μ μΆκ° νμμλ μκΎΈ 리λ‘λ λμ΄ μ°κ²°λ websocketμ΄ ν΄μ λλ νμμ΄ μμλ€.
daphneλ‘ μλ²λ₯Ό λλ €λ³΄κΈ°λ νκ³ μ¬λ¬ λ°©λ²μΌλ‘ μννμλλ° νλ£¨μ’ μΌ κ³ μν κ² μΉκ³ μ‘°κΈ μ΄μ΄μλ κ³³μ΄ λ¬Έμ μλ€.
vscode ν ν΄λμμ κ°μ΄ μ΄κ³ front ν μ€νΈλ live serverλ₯Ό django serverλ runserverλ‘ ν μ€νΈ νμλλ° λ€λ₯Έ vscodeμμ liveserverλ₯Ό μ΄κ³ ν μ€νΈλ₯Ό μ§ννμμλλ μ λλ κ²μ΄μλ€.
μ μ€λ₯μ μ΄μ μΈ μ¦μ¨ ν vscodeμμ db μ μ₯ λ‘μ§μ μΆκ° ν ν μ€νΈ νκ² λλ©΄ dbκ° μ μ₯, κ°±μ λλ©° νμΌμ μ μ₯μ΄ μ΄λ£¨μ΄μ§κ³ vscodeκ° μλ‘κ³ μΉ¨λμ΄ liveserverλ μλ‘κ³ μΉ¨κ³Ό λμμ μμΌμ°κ²°μ΄ λκΈ°κ² λλ κ²μ΄μλ€..
μ΄κ±Έ ν루λμ μ°Ύμλλ° μμ λ¨μνκ³³μ λ¬Έμ κ° μμλ€ γ γ γ μ΄μ΄μλ μ€λ₯..? μλλ° λ¬΄νΌ μ΄μ λ μ λλ€.class CreateRoom(AsyncWebsocketConsumer): # django channels authentication λ‘κ·ΈμΈ κ΄λ ¨ν μΈμ¦ κΈ°λ₯ μΆκ°ν΄μΌ ν¨ async def connect(self): # get room_id value self.room_name = self.scope["url_route"]["kwargs"]["room_id"] self.room_group_name = "chat_%s" % self.room_name await self.channel_layer.group_add( self.room_group_name, self.channel_name ) await self.accept() async def disconnect(self, close_code): await self.channel_layer.group_discard( self.room_group_name, self.channel_name ) async def receive(self, text_data): text_data_json = json.loads(text_data) room_id = text_data_json['room_id'] message = text_data_json['message'] # νλ‘ νΈμμ sender_id, receiver_id 보λ΄μ£Όλ λ‘μ§ νμ sender_id = text_data_json['sender_id'] receiver_id = text_data_json['receiver_id'] sender = await self.get_user_db(sender_id) receiver = await self.get_user_db(receiver_id) room_object = await self.get_chatroom_db(room_id) if not sender: print('Sender userκ° μ‘°νλμ§ μμ΅λλ€.') if not receiver: print('Receiver userκ° μ‘°νλμ§ μμ΅λλ€.') if not message: print('messageκ° μμ΅λλ€.') return await self.create_chat_log(room_object, sender, message) cur_datetime = datetime.now() ampm = cur_datetime.strftime('%p') cur_time = datetime.now().strftime('%I:%M') date = datetime.now().strftime('%Yλ %mμ %dμΌ') cur_time = f"AM {cur_time}" if ampm == 'AM' else f"PM {cur_time}" response_json = { 'message': message, 'sender': sender.id, 'room_id': room_id, 'cur_time': cur_time, 'date': date } await self.channel_layer.group_send( self.room_group_name, { 'type': 'chat_message', 'message': json.dumps(response_json) } ) # Receive message from room group async def chat_message(self, event): message_data = json.loads(event['message']) message = message_data['message'] sender = message_data['sender'] cur_time = message_data['cur_time'] date = message_data['date'] room_id = message_data['room_id'] # Send message to WebSocket await self.send(text_data=json.dumps({ "message": message, "sender": sender, "cur_time": cur_time, "date": date, "room_id": room_id })) @database_sync_to_async def get_user_db(self, user_id): user = User.objects.filter(id=user_id) if user: return user[0] return None @database_sync_to_async def get_chatroom_db(self, room_id): room = ChatRoom.objects.filter(id=room_id) if room: return room[0] return None @database_sync_to_async def create_chat_log(self, room_object, sender, content): RoomMessage.objects.create(room=room_object, user=sender, content=content)
μ½λλ μ§κ΄μ μ΄κ³ ν΄λΉ ν¨μλ€μ channels λ΄λΆ ν¨μλ‘ room idλ₯Ό λ°μ groupμ μμ±νκ³ ν΄λΉ κ·Έλ£Ήμ μ±λ λ μ΄μ΄λ₯Ό λ§λ λ€.
ν΄λΉ μ±λ λ μ΄μ΄λ‘ λ©μΈμ§λ₯Ό μ μ‘νλ©° μ μ‘ν¨κ³Ό λμμ dbμ λ©μΈμ§κ° μ μ₯μ΄ λλ κ²μ΄λ€.
π chatroom λͺ¨λΈμ μ‘μ μ μμ μ μμ μκ΄μμ΄ λ¨Όμ 보λ΄λ μ¬λμ΄ μ‘μ μκ° λμ΄ μ±ν λ°©μ΄ λ§λ€μ΄ μ§λ€.
μ¦ μ΄λ€ μ¬μ©μκ° ν¬ν¨λ λͺ¨λ λ°©μ κ°μ Έμ€λ €λ©΄ chatroom λͺ¨λΈμμ κ°μ Έμ€κ³ μΆμ μ¬μ©μκ° μ‘μ μμΌλ, μμ μμΌλ λͺ¨λ κ°μ Έμμ Querysetμ ν©μ³μΌ νλ€.
κ²μν΄λ³΄λ chainμ΄λΌλ κ²μ΄ μμκ³ μ½κ² ꡬνν μ μμλ°.model μ½λ
class ChatRoom(models.Model): sender = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name='Room_sender') receiver = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name='Room_receiver') def __str__(self): return str(f'id : {self.id}, sender : {self.sender}, receiver : {self.receiver}')
view μμ± μ½λ
opponent_receiver = ChatRoom.objects.filter(sender=cur_user_id) opponent_sender = ChatRoom.objects.filter(receiver=cur_user_id) temp_opp_receiver = [User.objects.get(email=x.receiver) for x in opponent_receiver] temp_opp_sender = [User.objects.get(email=x.sender) for x in opponent_sender] result_opp_user = list(chain(temp_opp_receiver, temp_opp_sender)) slz = UserListSerializer(result_opp_user, many=True)
μ½λλ₯Ό λ€ μ§κ³ μκ°ν΄λ³΄λ μ±ν μ΄ μ¨ μμλλ‘ μ λ ¬μ ν΄μ£Όμ΄μΌ νλ€...
κ·Έ μ½λλ λ°λ‘ λ μ€λ₯΄μ§λ μκ³ μ‘°κΈ μκ°μ νκ³ λ€μ μ§λ³΄μμΌ λ κ² κ°λ€.