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 |