用户的登录和登出
之前我们已经讲到,项目到现在,我们一共建立了两个app,分别是article
和bloguser
。
登录
1. 配置根路由
打开iblog/urls.py
path('bloguser/', include(('bloguser.urls', 'bloguser'), namespace='bloguser')),
2. 配置子路由
打开bloguser/urls.py
path('user_login/', views.user_login, name='user_login'),
3. 建立表单form
在bloguser中,新建forms.py
bloguser/forms.py
from django import forms
class UserLoginForm(forms.Form):
username = forms.CharField(required=True)
password = forms.CharField(required=True, min_length=6, max_length=20, error_messages={
'required': '密码必须填写',
'min_length': '密码不能低于6位',
'max_length': '密码不能超过15位'
})
4. 编写Views(视图)
bloguser/views.py
def user_login(request):
if request.method == 'POST':
user_login_form = UserLoginForm(request.POST)
# 判断表单数据是否完整
if user_login_form.is_valid():
# 获取表单数据
data = user_login_form.cleaned_data
user = authenticate(username=data['username'], password=data['password'])
if user:
# django自带的登录方式,登录信息保存在session中
login(request, user)
return redirect(reverse('blog:index'))
else:
context = {
'msg': '账号或密码错误'
}
return render(request, 'login.html', context)
else:
context = {
'msg': '请输入完整的信息'
}
return render(request, 'login.html', context)
else:
user_login_form = UserLoginForm()
context = {
'form': user_login_form
}
return render(request, 'login.html', context)
-
一定要先判断是否是POSt请求,还是其他请求,我们这里将请求方式分为两种,POST实现登录,其他的跳转登录页面。
-
Form表单的主要作用为:
- 生成HTML标签
- 验证数据
- 初始化页面内容
-
authenticate()
方法验证用户名称和密码是否匹配.(用户必须是AbstractUser和User). -
login()
是Django自带的登录方式,登录信息存在session
中,关于session后面讲,简单说就是互联网的会话验证信息。
5. 登录页面(templates)
templates/login.html
<div class="card-body">
<form method="POST" action="{% url 'bloguser:user_login' %}" class="needs-validation">
{% csrf_token %}
<div class="form-group">
<label for="username">用户名</label>
<input id="username" type="username" class="form-control" name="username"
tabindex="1" required autofocus>
<div class="invalid-feedback">
Please fill in your username
</div>
</div>
<div class="form-group">
<label for="password" class="d-block">密码
<div class="float-right">
<a href="#">
Forgot Password?
</a>
</div>
</label>
<input id="password" type="password" class="form-control" name="password"
tabindex="2" required>
<div class="invalid-feedback">
please fill in your password
</div>
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary btn-block" tabindex="4">
登录
</button>
</div>
</form>
</div>
6. 登录接口
templates/index.html
<li class="nav-item">
<a class="nav-link" href="{% url 'bloguser:user_login' %}">登录{{ user.username }}</a>
</li>
运行后程序,打开http://127.0.0.1:8000/bloguser/user_login/
然后输入用户账户和密码,点击登录,就登录成功啦。
这里为了判断是否登录成功,我们可以在登录的地方加一个标识,以后再优化,这里只是做一个标识。即登录成功后,会打印出用户的登录用户名。
用户退出
1. 配置子路由
打开bloguser/urls.py
path('user_logout', views.user_logout, name='user_logout'),
2. 编写Views(视图)
bloguser/views.py
# 退出
def user_logout(request):
logout(request)
request.session.flush()
return redirect(reverse("article:index"))
logout()
和login()
一样,Django自带- 我这里使用
flush()
删了一次session,此处可以不写,无影响。
编写接口(templates)
templates/index.html
<li class="nav-item">
<a class="nav-link" href="{% url 'bloguser:user_logout' %}">退出</a>
</li>
运行程序,进入首页,点击退出,会发现用户名消失,即退出成功
到这里,登录和退出就讲完了。有问题一起交流呀,再说一次,页面需要美化,代码需要优化,这只是为了很直观的说明而做的。