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

时间:2019-03-08 11:19:45

标签: python django django-login

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

3 个答案:

答案 0 :(得分:3)

您也可以使用此装饰器。

config.set("spark.executor.instances", "4")
config.set("spark.executor.cores", "8")
val sc = new SparkContext(config) // LINE #1
sc.setLogLevel("WARN")
sc.hadoopConfiguration.set("fs.s3a.aws.credentials.provider", "org.apache.hadoop.fs.s3a.AnonymousAWSCredentialsProvider")

然后在您的views.py中调用它。

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

答案 1 :(得分:1)

您可以通过修改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'),
]

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

答案 2 :(得分:0)

添加到Wasi和flaab的答案中,如果您有功能,可以像下面这样快速检查功能:

def register(request):
    if request.user.is_authenticated:
        messages.success(request, "You are already logged in")
        return redirect("YOUR-DESIRED-PATH-NAME")
    # YOUR CODE BLOCK #