首页 > 解决方案 > Django 2.1.5 身份验证(登录/注销)在浏览器后退按钮上中断

问题描述

我使用开箱即用的 django LoginView 和 LogoutView 创建了一个简单的登录注销应用程序。在我的应用程序中,我可以使用 CreateView 进行注册,使用 ListView 列出用户并使用 DetailView 获取用户详细信息。

当我单击浏览器的后退按钮时,我看到登录和注销问题。问题:

  1. 登录后,我被重定向到索引页面。但是,当我单击后退按钮时,我会返回登录页面并可以使用其他有效用户登录。

  2. 注销后,我被重定向到索引页面。但是,当我单击返回按钮时,我可以查看登录数据,例如列表页面和详细信息页面。

我的应用程序(帐户)的代码是:

settings.py
<code>
LOGIN_REDIRECT_URL = "/accounts/"
LOGOUT_REDIRECT_URL = "/accounts/"


project urls.py
<code>
urlpatterns = [
path("admin/", admin.site.urls),
path("accounts/", include("django.contrib.auth.urls")),
path("accounts/", include("accounts.urls")),
]


app urls.py
<code>

from django.urls import path
from django.contrib.auth import views as auth_views
from . import views
 app_name = 'accounts_app'
urlpatterns = [
path("", views.IndexPage_cview.as_view(), name="index_curl"),
path("login/", auth_views.LoginView.as_view(),name='login'),
path("logout/", auth_views.LogoutView.as_view(), name="logout"),
path("signup/", views.SignUp_cview.as_view(), name="signup_curl"),
path("super/", views.adminlist_cview.as_view(), name="super_curl"),
path("superdetail/<int:pk>", views.admindetail_cview.as_view(), 
name="super_detail_curl"),
]


app views.py
<code>
from django.contrib.auth import login, logout
from django.urls import reverse_lazy
from django.views.generic import TemplateView,CreateView, ListView, 
                                  DetailView
from django.contrib import auth
from django.contrib.auth.mixins import LoginRequiredMixin
from django.shortcuts import get_object_or_404
from . import forms

class IndexPage_cview(TemplateView):
   template_name = "accounts/index.html"


class SignUp_cview(CreateView):
  form_class = forms.UserCreate_cform
  success_url = reverse_lazy("login")   #redirect to /accounts/login/
  template_name = "accounts/signup.html"

class adminlist_cview(LoginRequiredMixin,ListView):
  template_name = 'accounts/super_list.html'
  model= auth.models.User

  def get_queryset(self):
     return auth.models.User.objects.order_by('username')


class admindetail_cview(LoginRequiredMixin,DetailView):
   template_name = 'accounts/super_detail.html'
   model= auth.models.User

  def get_object(self):
      return get_object_or_404(auth.models.User, pk=self.kwargs.get("pk"))




app model.py
<code>
from django.contrib import auth
from django.db import models


class User_cmodel(auth.models.User):

    def __str__(self):
        return "@{}".format(self.username)


app form.py
<code>
from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm


class UserCreate_cform(UserCreationForm):
    class Meta:
        fields = ("username", "email", "password1", "password2")
        model = get_user_model()


base.html

<div class="container">

<a href="{% url 'accounts_app:index_curl' %}">Home</a>

   	<ul >
   		{% if user.is_authenticated %}
            {% if request.user.is_superuser %}
                <li><a href="{% url 'admin:index' %}" >Admin</a></li>
                <li><a href="{% url 'accounts_app:super_curl' %}>Db List</a></li>
            {% endif %}
                <li><a href="{% url 'accounts_app:logout' %}>Log out</a></li>
      	{% else %}
      	    <li><a href="{% url 'accounts_app:login'%}" >Log in</a></li>
      	    <li><a href="{% url 'accounts_app:signup_curl' %}">Sign up</a></li>
      	{% endif %}

    </ul>
    </div>
    <div class="container mycontent">
          {% block content %}

          {% endblock %}

     </div>

login.html

	{% extends "base.html" %}

	{% block content %}
	<div class="container">

		<h1>Login</h1>
		<form method="POST" >
			{% csrf_token %}
			{% form %}
			<input type="submit" value="Login" >
		</form>
	</div>
	{% endblock %}

标签: django

解决方案


在代码中的任何地方,您都在使视图仅对登录用户可用。任何人都可以访问您的所有视图。

如果您使用自定义 Auth 后端,您可以使用 django.contrib.auth.decorators 中的 @login_required 装饰器。确保用户在进入视图之前已登录。

你应该读这个。https://docs.djangoproject.com/en/2.1/topics/auth/default/#authenticating-users


推荐阅读