2022.07.04 - [ํ๋ก์ ํธ/capstone] - Django Channels๋ก ์ค์๊ฐ ์๋ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ (1)
์ ๊ธ์์๋ websocket์ ์ด์ฉํด Vue.js์ Django๋ฅผ ์ฐ๊ฒฐํ์ต๋๋ค.
DB์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ฉด ํ๋ก ํธ๋ก ์๋ฆผ ์ ์กํ๊ธฐ
์ค๋ ๋ง๋ค ๊ธฐ๋ฅ์
DB์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ฉด ํ๋ก ํธ๋ก ์๋ฆผ์ ์ ์กํ๋ ๊ธฐ๋ฅ์ ๋๋ค.
ํญ๋ ฅํ์๊ฐ ๋ฐ์ํ๋ฉด DB์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๊ณ ํด๋น ๋ฐ์ดํฐ๊ฐ ํ๋ก ํธ๋ก ์ ์ก๋์ด์ผํฉ๋๋ค.
์ฆ, Django ๋ชจ๋ธ์ ๋ฐ์ดํฐ๊ฐ ์ถ๊ฐ๋๋ฉด ํด๋น ๋ฐ์ดํฐ๊ฐ ์น์์ผ์ด ์ฐ๊ฒฐ๋ ํ์ด์ง๋ก ์ ์ก๋์ด์ผํฉ๋๋ค.
Django Signal
์ด ๋ ์ฌ์ฉํ ๊ธฐ๋ฅ์ ๋ฐ๋ก Django์ Signal์ ๋๋ค.
Django Signal์ DB model์ save๊ฐ ์๋ํ๋ฉด, ์ ์ฅ์ด ์๋ฃ๋ ์ดํ์ ์ง์ ํ ๋์์ ์ํํ ์ ์๋๋ก ํ ์ ์์ต๋๋ค.
from django.dispatch import receiver ์ from django.db.models.signals import post_save ๋ฅผ ์ฌ์ฉํฉ๋๋ค
- post_save()์ ๋ด์ฉ์ ๋ชจ๋ธ์ save() ํจ์์ ๋์ ์ ํด์ง๊ฒ ๋๋ค.
์ธ์
- sender: ๋ชจ๋ธ ํด๋์ค๋ฅผ ์ ์ฅ
- instance: ๋ชจ๋ธ์ record ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- created: ์๋ก์ด record์ด ์์ฑ๋์๋ค๋ฉด True ์๋๋ผ๋ฉด False๋ฅผ ๋ฐํ
@receiver(post_save, sender=Notification)
def announce_likes(sender, instance, created, **kwargs):
if created:
channel_layer=get_channel_layer()
async_to_sync(channel_layer.group_send)(
"shares", {
"type": "share_notification",
"message": instance.content,
}
)
- decorater(@receiver)๋ฅผ ํตํด์ signal์ ํ์ํ ์ธ์๋ค(post_save, sender)์ ๋๊ฒจ์ค๋๋ค.
- ๋ง์ฝ Django ๋ชจ๋ธ์ ์๋ก์ด record๊ฐ ์ถ๊ฐ๋๋ฉด
- channel layer์ group์ Django ๋ชจ๋ธ์ content๋ฅผ ์ ์กํฉ๋๋ค
์ฝ๋
# consumers.py
from channels.generic.websocket import WebsocketConsumer
from channels.db import database_sync_to_async
from channels.layers import get_channel_layer
from asgiref.sync import async_to_sync
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import Notification
from .serializers import NotificationSerializer
# DB model์ ๊ด๋ จํด์ save๊ฐ ์๋ํ๋ฉด, ์ ์ฅ์ด ์๋ฃ๋ ์ดํ์ ์ง์ ํ ๋์์ ์ํ
@receiver(post_save, sender=Notification)
def send_update(sender, instance, created, **kwargs):
print("New reading in DB")
serializer = NotificationSerializer(instance)
if created:
print("New saving in DB")
channel_layer=get_channel_layer()
async_to_sync(channel_layer.group_send)(
"center_name", {
"type": "notify",
"data": serializer.data
}
)
- @receiver(post_save, sender=Notification)
- Notifiation ๋ชจ๋ธ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ํ(post_save) ์คํํ ์ฝ๋๋ฅผ ์์ฑํด์ฃผ๋ฉด ๋ฉ๋๋ค
- ์ ์กํ Notification ๋ฐ์ดํฐ๋ฅผ serializer์ ๋ด์์ฃผ์์ต๋๋ค
- if created
- Notification์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ฉด ์๋ ์ฝ๋๋ฅผ ์คํํฉ๋๋ค
- channel layer๋ฅผ ๊ฐ์ ธ์จ ํ serializer์ data๋ฅผ ์ ์กํฉ๋๋ค
๊ทธ ๊ฒจ๋ก๊ฐ, Notification ๋ชจ๋ธ์ ๋ฐ์ดํฐ๊ฐ ์ถ๊ฐ๋๋ฉด ํด๋น ๋ฐ์ดํฐ๋ฅผ ์น์์ผ์ด ์ฐ๊ฒฐ๋ ํ์ด์ง๋ก ์ ์กํฉ๋๋ค
'๐ ํ๋ก์ ํธ > ์บก์คํค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Django Channels๋ก ์ค์๊ฐ ์๋ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ (1) (2) | 2022.07.04 |
---|