2022.07.04 - [ํ๋ก์ ํธ/capstone] - Django Channels๋ก ์ค์๊ฐ ์๋ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ (1)
Django Channels๋ก ์ค์๊ฐ ์๋ ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ (1)
๋ฐฐ๊ฒฝ ์ค์๊ฐ ์๋ํ๋ ์๋ฆผ ์น ์๋น์ค์์ ๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ์ธ ์ค์๊ฐ ์๋ฆผ ๊ธฐ๋ฅ์ ๊ตฌํํด์ผํฉ๋๋ค ์ฐ์ ์์ ์๋๋ฆฌ์ค๋ฅผ ๋ณด๋ฉด ํญ๋ ฅํ์ ๋ฐ์ -> DB์ ํด๋น ๋ด์ฉ ์ ์ฅ -> ํด๋น DB ๋ด์ฉ์ ํด๋ผ์ด์ธ
min-kyung.tistory.com
์ ๊ธ์์๋ websocket์ ์ด์ฉํด Vue.js์ Django๋ฅผ ์ฐ๊ฒฐํ์ต๋๋ค.
DB์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ฉด ํ๋ก ํธ๋ก ์๋ฆผ ์ ์กํ๊ธฐ
์ค๋ ๋ง๋ค ๊ธฐ๋ฅ์
DB์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ฉด ํ๋ก ํธ๋ก ์๋ฆผ์ ์ ์กํ๋ ๊ธฐ๋ฅ์ ๋๋ค.
ํญ๋ ฅํ์๊ฐ ๋ฐ์ํ๋ฉด DB์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๊ณ ํด๋น ๋ฐ์ดํฐ๊ฐ ํ๋ก ํธ๋ก ์ ์ก๋์ด์ผํฉ๋๋ค.
์ฆ, Django ๋ชจ๋ธ์ ๋ฐ์ดํฐ๊ฐ ์ถ๊ฐ๋๋ฉด ํด๋น ๋ฐ์ดํฐ๊ฐ ์น์์ผ์ด ์ฐ๊ฒฐ๋ ํ์ด์ง๋ก ์ ์ก๋์ด์ผํฉ๋๋ค.
Django Signal
์ด ๋ ์ฌ์ฉํ ๊ธฐ๋ฅ์ ๋ฐ๋ก Django์ Signal์ ๋๋ค.
Signals | Django documentation | Django
Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate
docs.djangoproject.com
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 |
---|