博客五部曲之二 - 高级博客
1397 浏览 5 years, 11 months
24 用户登陆表单验证
版权声明: 转载请注明出处 http://www.codingsoho.com/本节会完成用户登陆的授权,这就要用到表单的验证以及django后端对用户的验证
更新form代码如下
class UserLoginForm(forms.Form):
username = forms.CharField()
password = forms.CharField(widget=forms.PasswordInput)
def clean(self, *args, **kwargs):
username = self.cleaned_data.get("username")
password = self.cleaned_data.get("password")
if username and password:
user = authenticate(username=username, password=password)
if not user:
raise forms.ValidationError("This user is not exist")
if not user.check_password(password):
raise forms.ValidationError("Incorrect password")
if not user.is_active:
raise forms.ValidationError("This user is not active")
return super(UserLoginForm, self).clean(*args, **kwargs)
当进行表单验证时,要执行clean函数,这个在form.is_valid调用的过程中被调用。
首先判断用户名和密码是否已存在,否则交给默认表单验证处理。用authenticate要验证用户名和密码,如果成功则返回用户。作为保护,再次验证该用户的密码是否正确,这个有的会在authenticate里完成。最后,再检查一下用户是否已激活,未激活用户是不允许登陆的。
更新登陆视图函数,这儿会继续执行authenticate函数做用户验证,看上去有点冗余,验证通过之后调用login完成用户登陆。注意:必须执行authenticate之后才可以调用login函数,否则无效。
同时,更新一下注销函数,这个很简单,只需要调用logout函数就可以了。
def login_view(request):
title = "login"
form = UserLoginForm(request.POST or None)
if form.is_valid():
username = form.cleaned_data.get("username")
password = form.cleaned_data.get("password")
user = authenticate(username=username, password=password)
login(request, user)
print request.user.is_authenticated()
return render(request, "form.html", {"form":form, "title":title})
def logout_view(request):
logout(request)
return render(request, "form.html", {})
上面的登陆函数登陆成功之后通常会重定向到某个网址,这个后面会实现,这儿只是打印了一下用户是否授权来验证登陆是否成功。
最后,别忘了给logout添加URL
urlpatterns = [
url(r'^login/', login_view, name="login"),
url(r'^logout/', logout_view, name="logout"),
]