2025.8.18: Django의 시그널

jiyongg·2025년 8월 18일

TIL: Today I Learned

목록 보기
24/30

주말동안 해커톤 작업을 했다. 그렇지만 아직 끝이 보이질 않는다... 구현도 아직 덜 끝났다. 리팩토링도 해야 하는데.. 오늘은 이번 해커톤 작업을 하면서 알게 된 Django의 시그널에 대해 간단히 정리한 내용을 남겨 두겠다.

시그널

프레임워크 내에서 액션이 발생함을 알림

시그널 리시버

def my_callback(sender, **kwrags):
    # 콜백 내용

리시버 연결

1) 시그널의 connect 메소드

from django.core.signals import request_finished

request_finished.connect(my_callback)

2) 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일 경우만 진행해서 생성된 인스턴스 정보 출력

참고 자료

profile
그냥 쓰고 싶은 것 쓰는 개발(?) 블로그

0개의 댓글