django信号在注册用户

时间:2015-07-02 09:46:25

标签: python django django-signals

我已经完成了信号的记录,但不太了解。

当我注册用户时,应该发出信号并且必须向用户发送确认邮件。

我不明白这个过程。有人能给我一个很好的例子,我怎么能这样做。注册用户时,应触发通知,并且必须向用户发送电子邮件。

2 个答案:

答案 0 :(得分:1)

我正是这样做的:

def user_created(sender, instance, created, *args, **kwargs):
    user = instance
    if created:         
        email_confirmed, email_is_created = EmailConfirmed.objects.get_or_create(user=user)
        if email_is_created:
            short_hash = hashlib.sha1(str(random.random())).hexdigest()[:5]
            base, domain = str(user.email).split("@")
            activation_key = hashlib.sha1(short_hash+base).hexdigest()
            email_confirmed.activation_key = activation_key
            email_confirmed.save()
            email_confirmed.activate_user_email()

#user_logged_in.connect(get_create_stripe)
post_save.connect(user_created, sender=settings.AUTH_USER_MODEL)

让我向您详细说明上述情况: 我们有一个user_created()函数,用于检查是否存在具有相同电子邮件ID的用户。如果没有,我们会拍一封激活邮件。怎么样?我们在信号(from django.db.models.signals import post_save)中有post_save,它在save()结束时发送信号。有关post_save的更多信息,请参阅here

您可以观看我的repository,以便更好地了解整个过程。

答案 1 :(得分:1)

这是一个非常广泛的问题,所以我将概述一些可能性,你必须选择如何处理它。

最简单,最明显的选择是完全避免信号。信号非常好,当您需要解耦应用程序时非常重要。因此,例如,如果您将来有其他应用程序需要在用户注册时执行某些,那么信号就是一个很好的起点。

在这种情况下,您可以在用户模型上使用信号post_save,因此在保存用户后执行您的逻辑。

from django.db.models.signals import pre_save
from django.dispatch import receiver
from django.contrib.auth.models import User


@receiver(post_save, sender=User)
def my_handler(sender, **kwargs):
    ...

或者,您甚至可以定义自定义信号,并在用户注册时触发它。

Django docs: Signals中有一篇很好的文档,其中的具体示例过于广泛,无法在此处呈现。

但是,如果您不需要解耦应用程序并且只是想在保存用户后发送电子邮件,那么您可以在处理用户注册的视图中执行此操作。这样您就可以避免使用信号进行编码的额外开销。