如何指定在验证用户时应该使用哪个数据库django?

时间:2012-04-18 23:24:40

标签: python database django

我想出了如何在辅助数据库中创建用户,但是在查看用户是否存在时,我无法弄清楚应该使用什么来使数据库使用辅助数据库而不是默认数据库然后可以通过身份验证。

说我有:

user = authenticate(username=username, password=password)

如何告诉django使用名为secondary的数据库而不是使用默认数据库?

另外,我假设这些方法遵循相同的方法,但我如何使用辅助数据库来使用login()或logout()。

1 个答案:

答案 0 :(得分:1)

身份验证只接受凭据,并且是在您获得用户之前在后端调用身份验证的快捷方式:

https://github.com/django/django/blob/master/django/contrib/auth/init.py#L39

假设您使用的是默认后端(https://github.com/django/django/blob/master/django/contrib/auth/backends.py#L4),我认为无法使用此后端并选择非默认数据库。

from django.contrib.auth.backends import ModelBackend

class NonDefaultModelBackend(ModelBackend):
    """
    Authenticates against django.contrib.auth.models.User.
    Using SOMEOTHER db rather than the default
    """
    supports_inactive_user = True

    def authenticate(self, username=None, password=None):
        try:
            user = User.objects.using("SOMEOTHER").get(username=username)
            if user.check_password(password):
                return user
        except User.DoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            return User.objects.using("SOMEOTHER").get(pk=user_id)
        except User.DoesNotExist:
            return None

我认为这会给你与默认后端相同的行为但是使用非默认的db。然后,您可以将后端添加到设置中或直接替换默认后端。

AUTHENTICATION_BACKENDS = (
    'path.to.mybackends.NonDefaultModelBackend', 
    'django.contrib.auth.backends.ModelBackend',)

左右。