博客五部曲之二 - 高级博客


1206 浏览 5 years, 4 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"),
]