web-dev-qa-db-ja.com

すでにログインしているときにユーザーがDjangoのログインページにアクセスできないようにするにはどうすればよいですか?

私のDjangoアプリケーションでは、ユーザーはログインした後でもURLを介してログイン/サインアップページにアクセスできます。これらのページにアクセスできないようにするにはどうすればよいですか?

urls.py

from Django.urls import path
from Django.contrib.auth import views as auth_views
from . import views

app_name = 'account'

urlpatterns = [
  path('signup/', views.register, name='register'),
  path('', auth_views.LoginView.as_view(), name='login'),
]

views.pyで認証されたユーザーをチェックするためにif-elseステートメントと書くことはできますが、views.pyでログインするための関数は使用していません。 Djangoのデフォルトのログインシステムとauthentication.pyページをカスタムログイン(電子メールアドレスを使用した認証)に使用しています。

authentication.py

from Django.contrib.auth.models import User

class EmailAuthBackend(object):
    """
    Authenticate using an e-mail address.
    """
    def authenticate(self, request, username=None, password=None):
        try:
            user = User.objects.get(email=username)
            if user.check_password(password):
                return user
            return None
        except User.DoesNotExist:
            return None

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

ブラウザでURLを入力してログインページまたはサインアップページにアクセスしようとするたびに、リダイレクトすでに認証されているユーザーをホームページに効率的にする方法を提案してください。

7
Akhilesh Kumar

このデコレータも使用できます。

def login_excluded(redirect_to):
    """ This decorator kicks authenticated users out of a view """ 
    def _method_wrapper(view_method):
        def _arguments_wrapper(request, *args, **kwargs):
            if request.user.is_authenticated:
                return redirect(redirect_to) 
            return view_method(request, *args, **kwargs)
        return _arguments_wrapper
    return _method_wrapper

次に、views.pyでそれを呼び出します。

@login_excluded('app:redirect_to_view')
def someview(request):
    # ...
0
flaab