Django用户配置文件创建代码运行两次 - 为什么?

时间:2011-04-15 01:31:41

标签: django

使用Django 1.2,我正在运行 django-registration 应用程序,并在注册创建用户后创建用户配置文件对象 - 使用来自其他一些问题的代码:

# models.py
def create_player_profile(sender, instance, created, **kwargs):
    signals.post_save.disconnect(create_player_profile, sender = User) # added.
    if created:
        print "creating profile."
        profile, created = PlayerProfile.objects.get_or_create(user = instance)
        print "profile %s created = %s" % (str(profile), str(created))
    else:
        print "problems creating profile."

signals.post_save.connect(create_player_profile, sender = User)

它工作正常:)唯一的问题是,我得到两组输出,表明代码正在运行两次。我怀疑由于某种原因,信号会被发送两次。

我的第一个想法是文件正在导入两次,设置两个相同的信号。这让我想知道是否 django-registration 自动做某事?或者其他我还不了解Django的东西。 :)

那为什么代码会运行两次?是否发送了两个信号,如果是,为什么?

更新刚刚注意到this Answer解释了如何避免重复信号。它有点工作:)我的输出来自:

  

创建个人资料   创建个人资料   创建档案的问题
  创建个人资料的问题

为:

  

创建个人资料   创建个人资料的问题

我不知道这是否意味着我的代码最初运行四次?而下降到只有两次?我很困惑。 :)

更新2 - 添加了 signals.disconnect 行。我想删除信号会阻止函数执行两次。唉,我错了 - create-player-profile 仍然运行两次......我不知道为什么会这样,如果信号被立即删除。

2 个答案:

答案 0 :(得分:1)

更新:删除了有关AUTH_PROFILE_MODULE

的内容
  

那为什么代码会运行两次?是   发送两个信号,如果是,   为什么呢?

我想问题不是信号被调用两次,而是你的User.save()方法在某处被调用两次(因此也是信号)。也许你应该先检查一下。

答案 1 :(得分:0)

如果模块的缩进不正确,如果你可能在create_player_profile函数中混合了空格和制表符缩进,也可能发生这种情况。