https://velog.io/@ifyouseeksoomi/10.DRF-Level-Three-Django-REST-Framework-1.-Signal

 

Django에서는 로그인, 로그아웃이나 모델 생성등 어떤 기능을 작동할 때, singal을 발생 시킨다. 

그래서 signal을 통해 기능을 추가할 수 있다. (회원가입 했을때 축하 메일을 보내는 것 처럼)

 

Django를 다룰 때 필수적인 기능인 signal에 대해서 정리해보려고 한다. 

 

이번에 할 기능은 회원 가입시 개발 중인 Page에서 자동으로 관련 모델을 생성해주는 기능을 적어보려고 한다. 

 

1. Signals.py

user_management/signals.py

from user.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
from user_management.models import UserCourseRelationship, UserPyCoin


@receiver(post_save, sender=User)
def create_user_account(sender, instance, created, **kwargs):
    if created:
        UserCourseRelationship.objects.create(user=instance)
        UserPyCoin.objects.create(user=instance)

회원 가입이 되었을 때, 자동으로 UserCourseRelationship 모델과 UserPyCoin 모델을 생성해주려고 한다. 

 

먼저 나는 User 모델이 user.models에 AbstractUser로 재정의 되어 있으니 user.models.py에서 가져왔다.

그리고 django signals을 가져오면 되는데 회원가입, 즉 새로운 User 모델이 생성이 되는 것이므로 post_save(모델이 생성될 때 사용하는 signal)을 사용한다. 

signal에 대한 문서는 

https://docs.djangoproject.com/en/3.2/ref/signals/#django.db.models.signals.post_save

윗 링크를 참고하자 (장고 공식 문서) 이외에도 다양한 signals이 존재한다.

 

@receiver를 통해 어떤 기능을 수행하는지 정의 해 준다. 

@receiver(post_save, sender=User)

위 코드의 뜻은 User 모델에 post_save signal을 보내겠다는 의미이다. 

함수명은 직관적이게 create_user_account로 해주었다.

 

그리고 새로운 User 모델이 생성되었을 때(회원 가입 시), 기본 모델을 생성해주는 것이기 때문에 created를 사용한다. (created를 사용하기 위해 post_save로 해주었다고 생각하면 된다. created가 없으면 User모델이 동작할 때 마다 이벤트가 발생된다. 즉 로그인만 해도 자동으로 기본 모델이 생성되어 버린다.)

 

def create_user_account(sender, instance, created, **kwargs):
    if created:
        UserCourseRelationship.objects.create(user=instance)
        UserPyCoin.objects.create(user=instance)

sender는 User 모델을 의미하고 instance에는 현재 만들어진 인스턴스(회원 가입이므로 방금 회원가입한 사람)가 저장된다. 정리하자면 sender는 모델 그 자체이고 instance는 방금 생성된 instance를 뜻한다.

 

 2. apps.py에 작성

user_management/apps.py

class AccountConfig(AppConfig):
    name = 'user_management'

    def ready(self):
        import user_management.signals

다음은 apps.py에 우리가 만든 signals.py를 등록해줘야한다. 여기서 name에는 signals.py가 있는 app이름을 적어야 한다. 

 

3. __init__.py 작성 (settings.py에 작성)

user_management/__init__.py

default_app_config = "user_management.apps.AccountConfig"

init 파일에 AccountConfig를 실행해주라는 코드를 작성한다. (하지만 Django에서는 installed_app에 적는 것을 권장하고 있다.)

 

settings.py

INSTALLED_APPS = [
	#'user_management', 대신에
    'user_management.apps.AccountConfig', # 로 적으면 된다.
]

위와 같이 바꾸어 주자.

 

이제 회원가입할 때 마다 자동으로 모델이 생성되어지는 것을 확인할 수 있다. signals를 사용하면 정말 다양한 기능을 구현할 수 있을 것으로 생각된다. 다음에는 회원가입을 했을 때, 자동으로 축하 메세지를 보내는 기능을 구현해보고 싶다.

 

추가)

user_management/apps.py

from django.apps import AppConfig


class UserManagementConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'user_management'

    def ready(self):
        import user_management.signals

단순하게 기존 apps.py에 def ready만 추가하고 signals을 받으면 된다.

 

settings.py

INSTALLED_APPS = [
	'user_management', # 그냥 기존과 같이 적으면 된다.
]

 

정리하자면 INSTALLED_APPS에 app이름을 등록을 해주면 일단 __init__.py을 실행한다. (기본적으로 아무 것도 정의되어 있지 않음) 그러면 자동으로 apps.py에 가서 AppConfig를 실행해주게 된다.

 

참고로 AutoField는 Django ORM에서 자동적으로 생성되는 Auto increment Primary key를 말한다.

출처: https://www.morenice.kr/263 [morenice's blog]

'Back-End > Django' 카테고리의 다른 글

Django Request, Requests  (0) 2021.12.16
Wagtail Django_extensions, ipython  (0) 2021.11.19
Django ORM  (0) 2021.10.21
Django iamport 적용하기  (0) 2021.10.06
Django Bulma 적용 방법  (0) 2021.08.24

+ Recent posts