繁体   English   中英

如何防止用户在已经登录时访问 django 中的登录页面?

[英]How to prevent user to access login page in django when already logged in?

在我的 Django 应用程序中,用户即使在登录后也可以通过 URL 访问登录/注册页面。 如何防止他们访问这些页面?

网址.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页面进行自定义登录(使用电子邮件地址进行身份验证)。

认证文件

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 来访问登录或注册页面时,已通过身份验证的用户重定向主页

您可以通过修改 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(redirect_authenticated_user=True), name='login'),
]

这将从登录页面重定向已通过身份验证的用户。 对于注册,您必须自定义您的注册功能,添加一个 if 用户是否经过身份验证检查。

你也可以使用这个装饰器。

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):
    # ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM