一、用类实现登录
1 、之前实现的登录是基于函数实现的,现在用类的方式实现
按住Ctrl并同时点击View,查看里面的方法,重写get()、post()方法,只需要将原来的函数写成类
如果是GET直接调用get()方法,所以不需要再进行判断是GET还是POST
2、url配置,这里调用as_view方法
3、django提供了表单类Form,直接使用现有的轮子更方便,Form可以将用户提交的表单进行一部分预处理,比如进行一些判断,验证等
关于django form介绍可参考:http://www.h5w3.com/doc/django-docs-1.9-en/topics/forms/index.html
4、新建forms.py文件,编写forms逻辑
继承Form,对username和password进行验证,这里的username和password和前端input便签中的是相同的,名称必须一致
5、编写views逻辑,首先要实例化LoginView类,如果使用POST请求提交表单,views会使用来自请求的数据,login_form = NameForm(request.POST)会将数据和表单绑定起来,那么login_form中 存放着数据,如果表单提交的数据通过验证,is_valid()方法返回Ture
参考:http://www.h5w3.com/doc/django-docs-1.9-en/topics/forms/index.html
打断点调试,在不输入用户名只输入密码的情况下调试,错误提示如下图,username是必填字段
在输入正确用户名,密码少于五位的情况下调试,错误提示密码至少是五位
二、将错误提示显示在前端
1、当用户名和密码错误时,需要将提示信息显示在前端,并将错误的方框选中,只需要将login_form的信息传递到模板中显示,效果如下图
2、编写views,数据通过render()中的login_form传递到模板中
2、模板中当用户名和密码不正确时,选中方框,并通过login_form将错误信息显示在前端
3、测试
当不输入用户名和密码的情况下,效果显示如图,显示错误信息过多,破坏了前端样式,我们将遍历中的key去掉,再刷新
输入正确用户名,不输入密码的情况下
总结:
1、继承View,用类的方式写了views逻辑,重写了View中的get()、post()方法
2、配置url时,用到了继承自View的as_view()方法
3、新建了forms文件,利用Form类验证前端传过来的数据的有效性
4、在views中实例化新建的LoginForm类数据通过request.POST参数传递到views中,并使用了is_valid()方法判断数据的合法性
views.py
# _*_ coding:utf-8 _*_
from django.shortcuts import render
from django.contrib.auth import authenticate, login
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q
from django.views.generic.base import View
from .models import UserProfile
from .forms import LoginForm
class CustomBackend(ModelBackend):
def authenticate(self, username=None, password=None, **kwargs):
try:
user = UserProfile.objects.get(Q(username=username) | Q(email=username)) # 将用户名和邮箱与数据库里的用户名和邮箱比较
if user.check_password(password): # 密码加密后与数据库里的密码比较
return user
except Exception as e:
return None
class LoginView(View):
def get(self, request):
return render(request, 'login.html', {})
def post(self, request):
login_form = LoginForm(request.POST)
if login_form.is_valid(): # 验证有效性,和forms中的验证相关
user_name = request.POST.get("username", "") # 取出前端传过来的username
pass_word = request.POST.get("password", "") # 取出前端传过来的password
user = authenticate(username=user_name, password=pass_word) # 验证username,password是否正确,和数据库比对
if user is not None: # 如果验证不通过,返回None
login(request, user) # 登录
return render(request, "index.html") # 暂时返回首页,首页登录部分变成个人中心
else:
return render(request, 'login.html', {"msg": "用户名或密码错误!"}) # 登录不成功还是返回登录页
else:
return render(request, "login.html", {"login_form": login_form})
# Create your views here.
# def user_login(request):
# if request.method == "POST":
#
# user_name = request.POST.get("username", "") # 取出前端传过来的username
# pass_word = request.POST.get("password", "") # 取出前端传过来的password
# user = authenticate(username=user_name, password=pass_word) # 验证username,password是否正确
# if user is not None: # 如果验证不通过,返回None
# login(request, user) # 登录
# return render(request, "index.html") # 暂时返回首页,首页登录部分变成个人中心
# else:
# return render(request, 'login.html', {"msg": "用户名或密码错误!"}) # 登录不成功还是返回登录页
#
# elif request.method == "GET":
# return render(request, 'login.html', {})