2012-04-18 2 views
0

私はセカンダリデータベースでユーザーを作成する方法を考え出しましたが、ユーザーが存在するかどうかを調べるときに、デフォルトデータベースの代わりにセカンダリデータベースを使用するようにデータベースを取得するために、認証することができます。ユーザの認証時にdjangoが使用するデータベースを指定する方法は?

は、私が持っていると言う:

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

は、どのように私の代わりに、デフォルトのデータベースを使用しての二次という名前のデータベースを使用するようにDjangoに教えていますか?

また、私はこれらが同じ方法に従うと仮定しますが、セカンダリデータベースを使用してlogin()またはlogout()を使用するにはどうすればよいでしょうか。

+0

デフォルトのModelBackendを使用していると思いますか? –

答えて

1

認証が唯一の認証情報を取得して、ユーザーを取得するまで、あなたのバックエンドで認証を呼び出すへのショートカットです:あなたは、デフォルトのバックエンド(https://github.com/django/django/blob/master/django/contrib/auth/backends.py#L4)を使用していると仮定すると、

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

を、使用する方法はありませんこのバックエンドと非デフォルトのデータベースを選択すると、私は思う。

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',) 

程度です。

+0

しかし、login()またはlogout()を使用するとどうなりますか? django \ contrib \ authを見ると、私はviews.pyファイルのログインフォームを見ることができます。ログインフォームに.using(databasename)を入れることができる場所はありません。 – city

+0

'login()'は新しいバックエンドで動作します。 'authenticate()'が新しいバックエンドで動作するため、 'AuthenticationForm'は新しいバックエンドで動作します。 –

+0

'password_reset_confirm'はデフォルトのdbにハードコードされたビュー内の唯一の場所です。便利なフォームに関しては、 'UserCreationForm'と' PasswordResetForm'がデフォルト以外のdbを使うためにオーバーライドされる必要があるようです。 –

関連する問題