准备工作:创建bookmarks项目,并在其下面创建account app。
具体步骤
一、在installed app里注册account,注意要把它注册在最前面,如下:
INSTALLED_APPS = [
'account',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
二、在account 的urls.py文件添加Django自带的Django.contrib.auth.views模块,该模块有LoginView,LogoutView,PasswordChangeView,PasswordChangeDoneView,PasswordResetView,PasswordResetDoneView,PasswordResetConfirmView和PasswordRestCompleteView,可以完成用户登录、注销、修改密码、重置密码的功能。以登录和注销为例说明如何利用这些功能。
因为他们本质上是views,所以我们直接可以在urls.py引用他们:导入这些view,并在路由路径中配置对应的views.代码如下:
from django.urls import path
from django.contrib.auth import views as auth_views
urlpatterns = [
path('login/',auth_views.LoginView.as_view(),name='login'),
path('logout/',auth_views.LogoutView.as_view(),name='logout'),
]
三、我们再创建相应的login和logout templates。这里有一点需要注意,因为我们使用的是自带的view,所以templates的路径也需要按指定的要求,template的名字也是固定的。Django.contrib.auth.views会在app的templates/registration文件下读取相应的template(login读取login.html,logout读取logged_out.html,一定要注意文件名!否则会读不到)。先在templates创建base.html,设定基本模板,然后在registration下创建login.html和logged_out.html文件,并引用base.html。代码如下:
#base.html
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}
{% endblock %}
</title>
</head>
<body>
<div id="header">
<span class="user">
<!-- 当前用户包含在HttpRequest对象中,可以通过request.user访问 -->
{% if request.user.is_authenticated %}
Hello {{request.user.username}}
<!-- 将超链接指向urls.py中的logout -->
<a href ="{% url "logout" %}">Logout</a>
{% endif %}
</span>
</div>
<div id = "content">
{% block content %}
{% endblock %}
</div>
</body>
</html>
#registration/login.html(django.contrib.auth.view指定名称,不能修改,否则出错)
{% extends 'base.html' %}
{% block tiltle %}
<p>Log in</p>
{% endblock %}
{% block content %}
<h1>Log-In</h1>
{% if form.error %}
<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是通过 django.contrib.auth.views穿过来的参数,固定名称 -->
{{ form.as_p}}
<!-- 对传递信息进行加密,不设置无法通过 -->
{% csrf_token %}
<p><input type ="submit" value="Log-in"></p>
</form>
</div>
{% endblock %}
#registration/logged_out.html(django.contrib.auth.view指定名称,不能修改,否则出错)
{% extends "base.html" %}
{% block title %} Logged out {% endblock %}
{% block content %}
<h1>Logged out</h1>
<p>
You have been sucessfully logged out.
<!-- 将超链接指向urls.py中的logoin -->
You can <a href=" {% url "login" %}">log-in again</a>
</p>
{% endblock %}
四、我们需要编写登录成功的页面,这个文件的名称可以自定义,如dashboard.html。我们把他放在templates根目录下,创建一个新的文件夹也可以。代码如下,比较简单,可以进一步扩展。
{% extends "base.html" %}
{% block title %}
Dashboard
{% endblock %}
{% block content %}
<h1>Dashboard</h1>
<p>Welcome to your dashboard.</p>
{% endblock %}
最后,我们要设置重定向,再登录成功后将页面转到dsashboard。先在urls.py中增加dashboard对应的路径,然后在settings.py中设置LOGIN_REDIRECT_URL='dashboard'。
urls.py设置
from django.urls import path
from django.contrib.auth import views as auth_views
from . import views
urlpatterns = [
path('login/',auth_views.LoginView.as_view(),name='login'),
path('logout/',auth_views.LogoutView.as_view(),name='logout'),
path('',views.dashboard,name='dashboard'),
]
setting.py设置
# LOGIN_URL 和LOGOUT_URL可以不设
#LOGIN_URL = 'login'
#LOGOUT_URL ='logout'
LOGIN_REDIRECT_URL = 'dashboard'
至此,用户登录与注销界面设定完毕。
测试运行效果:
-在usermgt目录下运行python manage.py migrate,创建相应的数据库。
- 通过python manage.py createsuperuser usr,创建用户
- 运行python manage.py runserver启动服务器,在浏览器中输入:localhost:8000/account/login
输入我们刚刚创建的用户名密码,提示登录成功。
退出登录
说明已经成功配置用户登录和密码。
总结:在利用用authenticate_framework设置用户登录和注销功能时,应注意几个点
1. Installd App:要把创建的app放在最前面至少在Django.contrib.auth前面,避免Django在处理logout时,读取admin模块的logout
2.login和logout模板需要放在指定位置,使用指定名字(templates/registration/login.html,templates/registration/logged_out.html)
3.需要在settings.py中设置登录成功后重订向试图LOGIN_REDIRECT_URL ='dashboard'