登录用户仍然看到登录页面(django auth)

时间:2014-04-08 19:28:08

标签: django authentication

我正在使用django.contrib.auth来处理我的django项目中的用户身份验证。为了登录,我有

from django.contrib.auth.views import login, logout

# ...

url(r'^login/', login, name='login'),
url(r'^logout/', logout, {'next_page': '/'}, name='logout'),

在我的主项目urls.py

到目前为止,这么好。但是,我注意到登录后,如果我访问/login/,我仍然会看到登录页面,并且能够以其他用户身份登录。这似乎是违反直觉的行为 - 如果您在登录时尝试访问登录页面,大多数网站都会显示错误或将您重定向到主页。

我正在使用内置模型/视图,因此据我所知,我没有简单的方法来改变视图。是否有一种获取此功能的简单方法(即阻止访问)如果登录,则登录表单,或者是仅修改模板以仅在未登录时显示表单的最佳方式?

6 个答案:

答案 0 :(得分:2)

您使用template.html隐藏templateTags内的内容,如下所示:

{% if user.is_authenticated %}
  <p>Only a logged in User can view</p>
{% else %}
  <p>Only a logged out User can view</p>
{% endif %}

[编辑]

如果您希望在呈现网页之前重定向用户,则可以在视图中执行此操作。

def myView(request):
    if request.user.is_authenticated:
        return render(request, 'logged_in_view.html')
    else:
        return render(request, 'logged_out_view.html')

答案 1 :(得分:2)

您可以这样简单地输入登录网址:

from django.contrib.auth import views as auth_views

path('login/', auth_views.LoginView.as_view(template_name="accounts/login.html", redirect_authenticated_user=True), name='login'),

答案 2 :(得分:1)

可能的解决方案: 我创建了&#39; my_login&#39;:

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

我在urls.py中使用def my_login(request): if request.user.is_authenticated(): return redirect(#...home) else: return login(request, 'template/login.html') # here i used login built-in function # instead of using directly in urls.py 视图而不是my_login

修改

'django.contrib.auth.views.login'

检查https://docs.djangoproject.com/en/1.10/topics/auth/default/#django.contrib.auth.views.login

答案 3 :(得分:0)

我不确定,但我相信最简单的方法是在处理登录的view内进行验证:

if(request.user.is_authenticated):
    return redirect('/'); #homepage, whatever
else:
    ....

答案 4 :(得分:0)

在登录方法中,检查请求上下文中的用户是否已登录。如果这样将该用户重定向到另一个视图,如果没有让他看到登录视图。

 def login_page(request):

   username = password = ''
   loginForm = LoginForm

  if request.POST:
    username = request.POST.get('usernameInput')
    password = request.POST.get('passwordInput')
    next = request.POST.get('nextInput')

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

    if user is not None:
        if user.is_active:
            login(request, user)
            state = "User successfully logged in!"

            return HttpResponseRedirect("/dashboard/")
        else:
            state = "Your account is not active"
    else:
        state = "Your username and/or password were incorrect."
  else:
    print('form was not posted')

  variables=RequestContext(request,{
    'form':loginForm
  })
  return render_to_response('login.html',variables)

答案 5 :(得分:0)

由于基于类的视图(CBV)正在上升。此方法将帮助您在仅为未经过身份验证的用户访问视图时重定向到另一个URL。

在我的示例中,注册页面覆盖了get()方法。

class Signup(CreateView):
    template_name = 'sign-up.html'

    def get(self, request, *args, **kwargs):
        if self.request.user.is_authenticated:
            return redirect('path/to/desired/url')
        else:
            # Omit the form if you are not using it.
            form = self.form_class() 
            return render(request, self.template_name, {'form': form})

为简单起见,您也可以在View类的dispatch()方法上执行此操作。

def dispatch(self, *args, **kwargs):
    if self.request.user.is_authenticated:
        return redirect('path/to/desired/url')
    return super().dispatch(*args, **kwargs)

干杯!