自定义用户模型会中断auth测试

时间:2011-03-27 12:17:37

标签: django testing fixtures authentication

Hecko在那里,

我正在使用我选择调用Member的自定义用户模型,该模型扩展了默认用户模型(几乎与here所述相同)。

这就是打破了auth app的几个测试,因为测试夹具只创建了标准的用户,而不是成员。当我将缺少的成员定义/行添加到django / contrib / auth / fixtures / authtestdata.json时,它们会再次运行,但这当然没有解决方案。

这是我做错事的结果,我应该如何最好地修复它?

作为最后的办法,我只想在Buildout中为authtestdata.json添加补丁,但也许有更优雅的解决方案。

非常感谢,
Telofy

2 个答案:

答案 0 :(得分:1)

根据http://docs.djangoproject.com/en/1.2/topics/auth/#storing-additional-information-about-users,您可以通过在settings.py中设置AUTH_USER_PROFILE参数获得一些乐趣。这是以Django可以使用的方式扩展标准用户模型的好方法。

答案 1 :(得分:1)

更新:请忽略我的帖子。使用自定义身份验证后端的the original version,并在django.contrib.auth.backends.ModelBackend AUTHENTICATION_BACKENDS中的自定义后端添加settings.py作为第二个(后备)后端。它具有相同的效果,而且更简单。


我现在已经摆脱了补丁,而是在我的问题中扩展了我链接到的custom auth backend,如果在成员表中找不到用户,则可以使用原始身份验证后端的方法(我的自定义用户)。如果发生这种情况,则会发出警告(运行测试时可能会有点烦人)。此外,消息测试会导致很多异常,但它们似乎对测试没有任何负面影响。我希望他们是故意的。 ^^

# -*- encoding: utf-8 -*-
import logging
from django.conf import settings
from django.contrib.auth.backends import ModelBackend
from django.core.exceptions import ImproperlyConfigured
from django.db.models import get_model

logger = logging.getLogger(__name__)

# http://scottbarnham.com/blog/2008/08/21/extending-the-django-user-model-with-inheritance/
class CustomUserModelBackend(ModelBackend):
    def authenticate(self, username=None, password=None):
        try:
            user = self.user_class.objects.get(username=username)
            if user.check_password(password):
                return user
        except self.user_class.DoesNotExist:
            user = super(CustomUserModelBackend, self).authenticate(username, password)
            if user:
                logger.warn("Using User, not Member: %s" % user)
            return user

    def get_user(self, user_id):
        try:
            return self.user_class.objects.get(pk=user_id)
        except self.user_class.DoesNotExist:
            user = super(CustomUserModelBackend, self).get_user(user_id)
            if user:
                logger.warn("Using User, not Member: %s" % user)
            return user

    @property
    def user_class(self):
        if not hasattr(self, '_user_class'):
            self._user_class = get_model(*settings.CUSTOM_USER_MODEL.split('.', 2))
            if not self._user_class:
                raise ImproperlyConfigured('Could not get custom user model')
        return self._user_class