编写django信号钩来检查用户是否已经存在

时间:2013-04-15 15:12:37

标签: django django-signals django-users

我们最近从一个LDAP系统切换到另一个。不幸的是,不仅LDAP服务器发生了变化,而且所有用户名也都发生了变化。

我设法配置django_auth_ldap来处理两个LDAP服务器,但是我无法阻止在我的数据库中创建新用户。

我试图将一个监听器连接到django_auth_ldap.backend.populate_user.connect,但该信号被评估after用户已被创建。

那么最好的办法是什么:

  • 验证用户
  • 检查数据库中是否有用户名
  • 检查数据库中的替代用户名
  • 必要时更新用户名(找到旧的和新的用户映射)
  • 如果找不到任何地方则创建新用户

编辑我知道信号处理程序,但我不知道如何(以及代码中的位置)解决防止重复用户创建的任务。我应该在哪里挂钩检查旧用户名和新用户名?

EDIT2:

我尝试过关注,但仍在创建new_name用户。

# touple of old user and new user names
username_list = [('old_name', 'new_name') ]

@receiver(pre_save, sender=User)
def check_if_user_exists(sender, **kwargs):
    try:
        print "check_if_user_exists:"
        user_instance = kwargs['instance']
        print user_instance
        if any([x[1] == user_instance.username for x in username_list]):
            print "new user name found!"
            # get old username
            user = User.objects.get(username = x[0])
            user.username = user_instance.username
            return user
        else:
            print "user not found :("
    except ObjectDoesNotExist:
        print ('user not found')
        pass

2 个答案:

答案 0 :(得分:0)

这是您在signal_handler上实施pre_save的方法。这些应该存在于您的models.py

@receiver(pre_save, sender=MyModel)
def check_if_user_exists_based_on_whatever(sender, **kwargs):
    try:
        user = MyModel.objects.get(kwargs['instance'].<field_to_get_on_model>)
        user.username = "new_username"
        user.save()
    except ObjectDoesNotExist:
        user = MyModel.create(name="mymyself", lastname="andI")

这只是一个基本的例子,我真的不知道你的所有验证逻辑。 ^ _ ^

答案 1 :(得分:0)

我最终编写了自己的身份验证后端,覆盖了get_or_create_user