2012-04-04 2 views
4

사용자 등록 인 socialauth_registered와 post_save에서 2 개의 신호가 전송되었습니다. socialauth_registered가 post_save 앞에 오도록하고 싶습니다. post_save가 트리거하는 함수에 영향을 미치기 때문입니다.Django 신호의 순서를 변경할 수 있습니까?

이것이 가능합니까? (이 경우와, 어떻게?!)

나는 정확히 관련 모르겠어요,하지만 난있어 :

from django.contrib.auth.models import User 
from social_auth.signals import socialauth_registered, pre_update 
from django.db.models.signals import post_save 

<ALL OF MY MODELS> 

def create_user_profile(sender, instance, created, **kwargs): 
    do some stuff 

def create_social_profile(sender, user, response, details, **kwargs): 
    do other stuff 

socialauth_registered.connect(create_social_profile, sender=None) 
post_save.connect(create_user_profile, sender=User) 

답변

5

내가 긍정적 아니지만, 나는 의심 스럽다 말할 것 . 더 중요한 것은 신호 뒤에있는 개념은 원자가되어야한다는 것입니다. 신호 처리기는 신호에 응답해야하며 다른 신호는 신경 쓰지 않아야합니다. 관련없는 두 신호 (예를 들어 pre_save와 post_save의 순서에 의존 할 수 있음)의 순서에 의존하는 것은 일반적으로 안전하지 않습니다. 당신의 질문에 확고한 대답이 없더라도 디자인에 대해 신중하게 생각해야한다는 조언을드립니다.

+1

감사합니다. 나는 신호 아이디어를 뒷받침하는 결과를 얻었고 확실히 뛰어난 다른 접근법을 시도했다. 당신이 명시 적으로 질문에 대답하지 않은 동안, 당신은 내가 묻을 수있는 올바른 질문이 아니라고 말했고, 아마 내가 얻을 수있는 가장 좋은 대답이었습니다! –

0

create_social_profile 및 create_user_profile을 호출하는 신호 하나를 고려해 보았습니까? 아마도이 신호를 post_save에 첨부 할 수 있습니까?

+0

불행히도 없습니다. post_save는 사용자 객체가 생성 될 때마다 트리거되며 socialauth_registered는 사용자가 타사를 통해 등록 할 때만 트리거됩니다. 일반 사용자의 경우 전자 메일을 확인합니다. 사회 보장 사용자에게는 불필요하므로이를 방지하고자합니다. 원칙적으로 정규 등록은 post_save를 유발하고 사회 등록은 socialauth_registered를 트리거합니다. –

2

아니요, 신호가 실행되는 순서를 변경할 수 없습니다.

는 신호의 우선 순위는 제안되었지만, 핵심 개발자들은이 기능을 구현하지 않습니다 말했다 :이 아주 오래된 질문 알고

https://code.djangoproject.com/ticket/16547

0

,하지만 나는 아무것도의 부족에 의해 놀랐다 나는 핸들러 주문에 대한 해결 방법과 관련이 있음을 발견했다. 여기에 우선 순위를 구현하는 디스패처의 하위 클래스가 있습니다.

from django.dispatch import Signal as BaseSignal 
from django.dispatch.dispatcher import _make_id 


class Signal(BaseSignal): 

    def connect(self, receiver, sender=None, weak=True, dispatch_uid=None, priority=50): 
     if dispatch_uid is None: 
      dispatch_uid = _make_id(receiver) 

     inner_uid = '{0}{1}'.format(priority, dispatch_uid) 
     super(Signal, self).connect(receiver, sender=sender, weak=weak, dispatch_uid=inner_uid) 
     self.receivers.sort() 

이 타사 응용 프로그램에 도움이되지 않습니다 동안, 당신은이 클래스와 함께 자신의 신호를 생성 할 수 있습니다, 당신은 자신의 응용 프로그램 내에서 핸들러를 주문 할 수 있도록 내장 된 신호에 첨부 .

관련 문제