9

我在用户注册时发送了 2 个信号,socialauth_registered 和 post_save。我希望 socialauth_registered 在 post_save 之前,因为它会影响 post_save 触发的功能。

这可能吗?(如果是,如何?!)

我不确定究竟是什么相关的,但我有:

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)
4

4 回答 4

15

不,您不能更改信号的执行顺序。

信号优先级已经提出,但核心开发者表示不会实现这个功能:

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

于 2014-03-30T15:10:30.247 回答
10

我不肯定,但我会说这是值得怀疑的。更重要的是,信号背后的想法是它们应该是原子的。信号处理程序应该响应信号而不应该关心其他信号。依赖两个不相关信号的顺序(例如,显然您可以依赖 pre_save 和 post_save 的顺序)通常是不安全的。因此,即使我对您的问题没有明确的答案,我也会提供您应该仔细考虑设计的建议。

于 2012-04-04T19:11:27.317 回答
3

我知道这是一个非常古老的问题,但令我惊讶的是,我发现没有任何与处理程序订购的解决方法相关的东西。所以这是实现优先级的调度程序的子类。

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()

虽然这对第三方应用程序没有帮助,但您可以使用此类创建自己的信号,并将它们附加到内置信号,从而允许您在自己的应用程序中订购处理程序。

于 2016-08-11T19:33:15.527 回答
0

您是否考虑过使用一种调用 create_social_profile 和 create_user_profile 的信号。也许您可以将此信号附加到 post_save?

于 2012-04-04T19:14:51.100 回答