私の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を入力してログインページまたはサインアップページにアクセスしようとするたびに、リダイレクトすでに認証されているユーザーをホームページに効率的にする方法を提案してください。
このデコレータも使用できます。
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):
# ...