Django signals

Woosang·2021년 9월 9일
0

django

목록 보기
2/2

장고의 signals

  • 장고 공식문서
    Django includes a “signal dispatcher” which helps decoupled applications get notified when actions occur elsewhere in the framework. In a nutshell, signals allow certain senders to notify a set of receivers that some action has taken place. They’re especially useful when many pieces of code may be interested in the same events.
  • 한마디로 장고에서 분리된 어플리케이션의 작업이 발생했음을 알려주고 처리할 수 있는 기능
  • etc) 회원가입을 한 경우, 회원이 탈퇴한 경우

  • 나의 경우 User는 장고에서 제공하는 User Model을 사용, Profile ModelUser ModelOneToOneField로 관계를 지어 생성.
  • 회원가입(User생성) 시 User Model에만 데이터가 담기게 된다.
  • 사용자는 Profile 생성을 위해 회원가입 시 작성했던 내용을 다시 Profile에 작성해야되는 문제발생
  • 이를 해결하기 위해 signals 사용
  • 또한 welcome mail 등 다양한 곳에서 활용이 가능하다.

사용예제

  • 설명 위에 문제로 소개한 회원가입 시 작성한 내용과 일치하는 Profile field들을 자동으로 생성하기

flow

  1. <app_name 나의 경우 users>/models.py에서 필요한 재료 import
    from django.db.models.signals import post_save
  1. signal 함수 정의 (함수명은 본인 마음대로!) 후 signal 연결
  2. models.py에서 signal 분리하기
  3. 데코레이터 사용하기

1. import, 2. 함수 정의 및 signal 연결

  • 일단 코드
from django.db.models.signals import post_save
from django.contrib.auth.models import User

def create_profile(sender, instance, created, **kwargs):
	if created == True:
    	user = instance
        profile = Profile.objects.create(
        	owner = user,
            user_name = user.username,
            email = user.email,
            name = user.first_name,
        )

post_save.connect(create_profile, sender=User)
  • created의 경우 작업이 생성이면 True가 반환, 업데이트 등 생성이 아니면 False를 반환한다.
    • 지금은 post_save를 사용하는 경우로 파라미터가 (sender, instance, created, **kwargs)이고 post_delete의 경우 (sender, instance, **kwargs)
  • instance값은 연결해주는 Model의 값🔒을 가진다.
    - post_save.connect()의 인수인 sender이 위의 자물쇠의 🔑
  • instance를 변수로 받아 이를 이용해 Profile의 Field를 채워준다.
    - create()메소드를 이용해 새성
    - 📍각 model의 field명으로 접근📍
    - ERD 참고

  • 여기까지하면 완성! 이제 회원가입 한 정보들 중 원하는 정보를 설정하여 Profile에도 같이 저장된다.
  • 그런데 models.py에 model과 signal이 같이 있으면 더러우니 signals.py를 만들어 분리시켜주자

3. signal 분리하기

  • 해당 app directory 안에 signals.py 생성
  • signals.py안에 똑같이 복!붙!
  • 여기까지하면 실행이 안됨 (signals.py는 임의로 만든 파일이므로)
  • signals.py를 사용하겠다고 설정하러 apps.py이동하여 이렇게 작성해주자
from django.apps import AppConfig

class UsersConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'users'
    # 기본적으로 여기까지 되어있음
    
    def ready(self): # ready메소드 추가
    	import users.signals
  • 이렇게하면 실행이 된다. (장고가 처음 실행될 때 apps.py를 먼저 쫙~읽어들이기 때문에 여기에 설정)

📌 settings.py의 INSTALLED_APPS 설정

  • 새롭게 생성된 app을 등록하는데 그냥 app명만 적는 경우 위의 signals.py실행이 안된다.
  • 때문에 Full Name으로 적어주자 users.apps.UsersConfig

4. 데코레이터 사용

  • 장고에서 제공하는 데코레이터를 사용하면 connect하는 부분을 함수명 위에 설정 가능
    from django.dispatch import User

  • 데코레이터 사용 전 👇

  • 사용 후 👇

1개의 댓글

comment-user-thumbnail
2023년 8월 3일

감사합니다!

답글 달기