外观
使用会话实现登录功能
Session可以记录用户的行为和数据,所以Session可以用于处理用户登录事件上。若用户在输入正确的用户名和密码后,就可以向Session中写入用户的个人信息,在其他需要用户登录后才能获取的页面中就可以使用Session获取用户数据。
要实现这种方式,首先进入Shell中。
python manage.py shell在Shell模式中,首先先创建一个用户。
>>> from django.contrib.auth.models import User
>>> User.objects.create_user(username='qi1', password='qi1')
<User: qi1>上述命令中,创建了一个用户名为qi1,密码也为qi1的用户。接下来,使用Django的authenticate()判断用户名和密码是否正确。
>>> from django.contrib.auth import authenticate
>>> user = authenticate(username='qi1', password='qi1')
user
>>> user = authenticate(username='qi1', password='123456')
user上述代码中,若传递了错误的用户名和密码,authenticate()方法将返回None;当传递正确的用户名和密码时,会返回正确的User对象。
然后修改登录表单,将邮箱字段改为密码字段。修改blog/article/forms.py,关键代码如下:
from django import forms
from django.forms import CharField
class LoginForm(forms.Form):
username = forms.CharField(
label='姓名',
required=True,
min_length=3,
max_length=10,
widget=forms.TextInput(attrs={'class': 'form-control'}),
error_messages={
'required': '用户名必须填写',
'min-length': '长度不能少于3个字符',
'max-length': '长度不能多于10个字符'
}
)
password = CharField(
label='密码',
required=True,
min_length=3,
max_length=50,
widget=forms.TextInput(attrs={'class': 'form-control'}),
error_messages={
'required': '密码必须填写',
'min-length': '长度不能少于3个字符',
'max-length': '长度不能多于50个字符'
}
)然后修改登录函数,添加对用户名密码的验证。修改blog/article/views.py文件中的LoginView类,关键代码如下:
from article.models import Article
from django.contrib import messages
from django.contrib.auth import authenticate, login
from django.http import HttpResponse, HttpResponseRedirect
class LoginFormView(View):
def get(self, request, *args, **kwargs):
return render(request, 'login.html', {'form': LoginForm()})
def post(self, request, *args, **kwargs):
# 将请求数据传入到form实例中
form = LoginForm(request.POST)
# 判断是否为有效表单
if form.is_valid():
username = form.cleaned_data['username']
password = form.cleaned_data['password']
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
return HttpResponseRedirect('/articles/')
else:
messages.add_message(request, messages.WARNING, '用户名或密码不正确')
else:
return render(request, 'login.html', {'form': form})上述代码中,当用户点击登录按钮后会调用POST请求对应的post()方法,在这其中首先实例化表单类,然后检验表单中的值是否符合要求。若不符合要求则重新要求重新输入表单。接着验证用户名和密码是否正确。若正确则调用login()函数向Session中写入登录信息。
接着修改模板文件,打开blog/article/template/login.html,修改关键代码如下:
{% extends 'base.html' %}
{% block titie %}登录页面
{% endblock %}
{% block content %}
<style>
.errorlist {
color: red;
}
</style>
<div class="container">
{% if messages %}
{% for message in messages %}
<div class="errorlist {% message.tags %}" >{% message %}</div>
{% endfor %}
{% endif %}
<form action="" method="post">
{% csrf_token %}
<div class='form-group'>
<label>{{ form.username.label }}</label>
{{ form.username }}
{{ form.username.errors }}
</div>
<div class='form-group'>
<label>{{ form.password.label }}</label>
{{ form.password }}
{{ form.password.errors }}
</div>
<button type="submit">提交</button>
</form>
</div>
{% endblock %}