주말동안 해커톤 작업을 했다. 그렇지만 아직 끝이 보이질 않는다... 구현도 아직 덜 끝났다. 리팩토링도 해야 하는데.. 오늘은 이번 해커톤 작업을 하면서 알게 된 Django의 시그널에 대해 간단히 정리한 내용을 남겨 두겠다.
프레임워크 내에서 액션이 발생함을 알림
def my_callback(sender, **kwrags):
# 콜백 내용
connect 메소드from django.core.signals import request_finished
request_finished.connect(my_callback)
receiver 데코레이터from django.core.signals import request_finished
from django.dispatch import receiver
@receiver(request_finished)
def my_callback(sender, **kwargs):
# 콜백 내용
signals.py에 위치apps.py에서 시그널 import하는 코드 추가from django.apps import AppConfig
from django.core.signals import request_finished
class MyAppConfig(AppConfig):
# ...
def ready(self): # implicit하게 연결
from . import signals
request_finished.connect(signals.my_callback) # explicit하게 연결
from django.db.models.signals import pre_save
from django.dispatch import receiver
from myapp.models import MyModel
@receiver(pre_save, sender=MyModel)
def my_handler(sender, **kwargs):
# 콜백 내용
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import MyModel
@receiver(post_save, sender=MyModel)
def instance_create_callback(sender: MyModel, **kwargs):
# 생성되었을 때가 아니면 리턴
if not kwargs.get('created'):
return
print(kwargs.get('instance'))
post_save: save() 메소드의 마지막에 전송되는 시그널save 메소드는 INSERT거나 UPDATE이기 때문에, kwargs에서 created의 값으로 INSERT인지 UPDATE인지를 확인UPDATE일 경우 return하고, INSERT일 경우만 진행해서 생성된 인스턴스 정보 출력