Django在身份验证框架中包含了一些你可以直接使用的表单和视图。在大多数情况下,可以使用默认的Django认证视图。
Django在django.contrib.auth.views提供了以下基于类的视图来处理身份验证:
LoginView:处理登录表单并登录用户
LogoutView:注销用户
Django提供了以下视图来处理密码修改:
PasswordChangeView:修改用户密码
PasswordChangeDoneView: 修改密码后重定向到成功视图
Django还包含以下视图来允许用户重置密码:
PasswordResetView:生成一个带令牌的一次性使用链接,并将其发送到用户的电子邮件账户。
PasswordResetDoneView:告诉用户一封包含重置密码链接的电子邮件已经发送给他们。
PasswordResetConfirmView:允许用户设置新密码?
PasswordResetCompleteView:用户重置密码成功后重定向到成功视图。
在创建带有用户帐户的网站时,上面列出的视图可以节省大量时间。
📌视图使用可以覆盖的默认值,例如要呈现的模板的位置,或者视图要使用的表单。
编辑urls.py
from django.urls import path,include
from django.contrib.auth import views as auth_views
from . import views
urlpatterns = [
? ? # path("login/",views.user_login,name='login'),
path("login/",auth_views.LoginView.as_view(),name='login'),
? ? path("logout/",auth_views.LogoutView.as_view(),name='logout'),
]
注释掉之前创建的user_login视图的URL模式,以使用Django认证框架的LoginView视图。我们还为LogoutView视图添加了一个URL模式。
关于account应用的基础代码,请查看Django身份验证初试-CSDN博客
django.contrib.admin模块包含一些用于管理站点的身份验证模板。account应用放在INSTALLED_APPS设置的顶部,这样Django就会默认使用我们的模板,而不是其他应用中定义的认证模板。
INSTALLED_APPS = [
? ? "django.contrib.admin",
#...
]
📌在account应用程序的模板目录中创建一个新目录,并将其命名为registration。这是Django认证视图期望你的认证模板所在的默认路径。
在templates/registration目录下创建一个新文件,命名为login.html,并添加以下代码:
{% extends "base.html" %}
{% block title %}Log-in{% endblock %}
{% block content %}
? ? <h1>Log-in</h1>
? ? {% if form.errors %}
? ? ? ? <p>
? ? ? ? Your username and password didn't match.
? ? ? ? Please try again.
? ? ? ? </p>
? ? {% else %}
? ? ? ? <p>Please, use the following form to log-in:</p>
? ? {% endif %}
? ? <div class="login-form">
? ? ? ? <form action="{% url 'login' %}" method="post">
? ? ? ? {{ form.as_p }}
? ? ? ? {% csrf_token %}
? ? ? ? <input type="hidden" name="next" value="{{ next }}" />
? ? ? ? <p><input type="submit" value="Log-in"></p>
? ? ? ? </form>
? ? ? ? </div>
{% endblock %}
在templates/registration目录下创建logged_out.html模板
{% extends "base.html" %}
{% block title %}Logged out{% endblock %}
{% block content %}
? ? <h1>Logged out</h1>
? ? <p>You have been successfully logged out. You can
? ? ? ? <a href="{% url 'login' %}">log-in again</a>.
? ? </p>
{% endblock %}
这是Django在用户退出后显示的模板。 ?
在为登录和注销视图添加了URL模式和模板之后,网站就准备好让用户使用Django认证视图登录了。
创建一个新视图,以便在用户登录其帐户时显示仪表板。 ?
打开account应用程序的views.py文件,并向其中添加以下代码:
from django.shortcuts import render
from django.http import HttpResponse
from django.contrib.auth import authenticate,login
from .forms import LoginForm
from django.contrib.auth.decorators import login_required
@login_required
def dashboard(request):
? ? return render(request,'account/dashboard.html',{'section':'dashboard'})
📌使用section变量来跟踪用户正在浏览的站点部分。多个视图可能对应于同一个部分。这是定义每个视图对应的部分的一种简单方法。
现在需要为仪表板视图创建一个模板。在templates/account/目录下创建一个新文件,并命名为dashboard.html。
{% extends "base.html" %}
{% block title %}Dashboard{% endblock %}
{% block content %}
? ? <h1>Dashboard</h1>
? ? <p>Welcome to your dashboard.</p>
{% endblock %}
然后,在account应用程序的urls.py文件中为这个视图添加如下URL模式:
urlpatterns = [
#...
? ? path("",views.dashboard, name='dashboard')
]
编辑项目的settings.py文件,使用的是之前在path()函数的name属性定义的URL模式的名称。
LOGIN_REDIRECT_URL = 'dashboard'
LOGIN_URL = 'login'
LOGOUT_URL = 'logout'
现在编辑base模版,添加登录和注销链接,以便将所有内容组合在一起。
当前用户由身份验证中间件在HttpRequest对象中设置。可以使用request.user访问它。即使用户没有经过身份验证,您也会在请求中找到User对象。未经身份验证的用户在请求中被设置为AnonymousUser的实例。检查当前用户是否通过身份验证的最佳方法是访问其只读属性is_authenticated。
编辑base.html模板id为header的div
? ? <div id="header">
? ? ? ? <span class="logo">Bookmarks</span>
? ? ? ?
? ? ? ? {% if request.user.is_authenticated %}
? ? ? ? <ul class="menu">
? ? ? ? ? ? <li {% if section == "dashboard" %}class="selected"{% endif %}>
? ? ? ? ? ? ? ? <a href="{% url 'dashboard' %}">My dashboard</a>
? ? ? ? ? ? </li>
? ? ? ? ? ? <li {% if section == "images" %}class="selected"{% endif %}>
? ? ? ? ? ? ? ? <a href="#">Images</a>
? ? ? ? ? ? </li>
? ? ? ? ? ? <li {% if section == "people" %}class="selected"{% endif %}>
? ? ? ? ? ? ? ? <a href="#">People</a>
? ? ? ? ? ? </li>
? ? ? ? </ul>
? ? ? ? {% endif %}
? ? ? ? <span class="user">
? ? ? ? {% if request.user.is_authenticated %}
? ? ? ? Hello {{ request.user.first_name }},
? ? ? ? ? ? <a href="{% url "logout" %}">Logout</a>
? ? ? ? {% else %}
? ? ? ? ? ? <a href="{% url "login" %}">Log-in</a>
? ? ? ? {% endif %}
? ? ? ? </span>
? ? </div>
总结一下到目前为止所做的工作: