6-3 django在线教育平台----用户登录2

一、登录测试

1、打开数据库,查看用户名和密码,密码是加密后的

这里写图片描述

用邮箱登录,邮箱登录验证不通过,此时的user是None
这里写图片描述

2、用户名登录时出现错误,是因为出现同名函数login

这里写图片描述

修改如下
这里写图片描述

这里写图片描述

修改后再次登录,当重新输入网址进入主业时也是显示已经登录状态,因为后台的session判断已经登录了,有一个登录有效期

这里写图片描述

这里写图片描述

二、如何通过username和email都可以登录

django可以自定义authenticate后台验证方法,首先在settings中重载变量,重写类继承ModelBackend,并重载类ModelBackend中的方法authenticate,将提交的登录数据与数据库中的数据进行对比验证,需要注意数据库里的密码是密文,所以通过check_password()方法验证前端明文的密码,在这里没有改变原有逻辑的代码,只是重载了验证方法

1、编写逻辑,打断点,三个断点执行的顺序如图中的1,2,3所示,在这过程中调用的我们自已定义的authenticate方法

这里写图片描述

这里写图片描述

2、如何通过邮箱验证呢?

只需要去取出提交的邮箱和数据库对比就可以了,这里引入了Q的用法

这里写图片描述

3、退出登录重新测试

在后台注销退出

这里写图片描述

这里写图片描述

使用邮箱登录

这里写图片描述

登录成功

这里写图片描述

三、登录失败错误信息提示

1、需要从后台传递错误信息模板中,数据在render()中传到模板,模板中由相应变量接收,根据逻辑判断是否在前端出现错误提示

这里写图片描述

这里写图片描述

2、重新登录测试

这里写图片描述

这里写图片描述

3、输入正确的用户名和密码又登陆成功了

users 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 .models import UserProfile


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


# 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', {})

四、总结

django在表单处理时担任的角色

这里写图片描述

1、准备和重组数据以使其为渲染做好准备
2、为数据创建HTML表单
3、接收和处理客户提交的表格和数据

猜你喜欢

转载自blog.csdn.net/f1ngf1ngy1ng/article/details/80917645
6-3
今日推荐