django学习入门系列之第十点《A 案例: 员工管理系统11》


13 用户认证

http://127.0.0.1:8000/admin/1/reset/
http://127.0.0.1:8000/admin/reset/

上述网址这种都是

  • 无状态&短链接的
这两个的意思其实是
默认情况下,我们发送与浏览器返回的数据只有单次传输,传输完之后就立刻断开
当下一次传输时,浏览器默认你是“新用户”
所以每一次连接都是“新用户连接”

当浏览器向你网站发起请求的时候,在网站响应的时候,网站可以做两件事,网站可以在你浏览器上写一个类似于==“键值对”==这样的东西

所以网站在给你响应数据的时候,会给你响应两类:响应体响应头这两种东西

  • 响应体

    • 你能在网页上看到的这些内容,类似于看到的界面这样子
  • 响应头

    • 响应头有很多,其中有一个叫cookie,可以理解他为一个字典,也可以理解为一个‘凭证’

    • 所以有了cookie这种机制后,网站才会知道你是 “登录过的人”,不然的话一律按新用户

    • 当发送请求时,cookie会自动携带进去

  • session

    • 相当于服务端存储用户数据的一个地方
    • 只是一个概念
    • django默认存储到数据库

13.1 用户登录

  • 这次用户登录不是为了写入数据库,而是与数据库的比较校验
  • 如果是对数据库进行比较校验,可以直接用form组件

必填项

# 用了这个样式的话,这个空就是必填项了
required=True
# 这里使用的是form的格式
# required=True 必填,不能为空
class LoginForm(BootStrapForm):
    username = forms.CharField(
        label="用户名",
        widget=forms.TextInput,
        required=True,)
    password = forms.CharField(
        label="密码",
        widget=forms.PasswordInput,
        required=True,)

关闭前端校验

novalidate
<form method="post" novalidate>
        {% csrf_token %}
        {% for foo in form %}
        <div class="form-group">
            <label>用户名</label>
            {{ foo }}
            <span style="color: red">{{ foo.errors.0 }}</span>
        </div>
    {% endfor %}
    <div>
        <button type="submit" class="btn btn-primary button">登录</button>
    </div>
</form>

展示错误信息

  • 当我们想主动展示错误信息的时候
form.add_error("需要添加错误信息的字段", "需要添加错误信息的内容")
form.add_error("password", "用户名或密码错误")

校验密码信息

def login(request):
    """登录页面"""
    if request.method == 'GET':
        form = LoginForm()
        return render(request, "login.html", {'form': form})

    form = LoginForm(data=request.POST)
    if form.is_valid():
        # 去数据库获取用户对象,并进行校验
        admin_object = models.Admin.objects.filter(**form.cleaned_data).first()
        if not admin_object:
            # 主动展示错误信息
            form.add_error("password", "用户名或密码错误")
            # 用户名密码错误
            return render(request, "login.html", {'form': form})

    return render(request, "login.html", {'form': form})

保留错误密码

render_value=True
class LoginForm(BootStrapForm):
    username = forms.CharField(
        label="用户名",
        widget=forms.TextInput,
        required=True, )
    password = forms.CharField(
        label="密码",
        widget=forms.PasswordInput(render_value=True),
        required=True,)

cookie

Cookie,有时也用其复数形式 Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。
  • 当比对成功时,采用cookie
    • 在django中,django帮你你简化好了,所以只用写一句就可以帮你把全部做完
request.session["值"] = {内容}
request.session["info"] = {'id': admin_object.id, 'name': admin_object.username}

在session中会以这样的方式进行存储

在这里插入图片描述

总代码

from django.shortcuts import render, redirect
from app01 import models
from app01.untils.pagination import pagination
from app01.untils.form import user_mode, mobile_mode
from django import forms
from app01.untils.bootstrap import BootStrapModelForm, BootStrapForm
from django.core.exceptions import ValidationError
from app01.untils.encrypt import MD5


# 这里使用的是form的格式
# required=True 必填,不能为空
# 定义钩子方法,将明文转化为密文
class LoginForm(BootStrapForm):
    username = forms.CharField(
        label="用户名",
        widget=forms.TextInput,
        required=True, )
    password = forms.CharField(
        label="密码",
        widget=forms.PasswordInput(render_value=True),
        required=True,)

    def clean_password(self):
        pwd = self.cleaned_data.get("password")
        return MD5(pwd)


def login(request):
    """登录页面"""
    if request.method == 'GET':
        form = LoginForm()
        return render(request, "login.html", {'form': form})

    form = LoginForm(data=request.POST)
    if form.is_valid():
        # 去数据库获取用户对象,并进行校验
        admin_object = models.Admin.objects.filter(**form.cleaned_data).first()
        if not admin_object:
            # 主动展示错误信息
            form.add_error("password", "用户名或密码错误")
            # 用户名密码错误
            return render(request, "login.html", {'form': form})

        # 当比对成功时,采用cookie
        # 网站生成随机字符串;写到用户浏览器的cookie中;在写入到session中;
        # 随机字符串默认存在数据库中
        request.session["info"] = {'id': admin_object.id, 'name': admin_object.username}
        # 然后自动跳转到其他位置
        return redirect("/admin/list")

    return render(request, "login.html", {'form': form})

登录成功后

  • cookie 随机字符串
  • session 用户信息

要在其他界面中写入,需要登陆后才能访问的内容

info = request.session.get("info")
    if not info:
        return redirect("/login")
def xxx(request):
    # 检查用户是否已登录,已登录,继续想下走。未登录,跳转回登录页面
    # 用户发来请求,获取cookie随机字符串,拿着随机字符串看看session中有没有。
    # 获取cookie中的数值,如没有时则返回为空
    info = request.session.get("info")
    if not info:
        return redirect("/login")
    
    
    xxxx.......

往期回顾

1.【快速开发网站】
2.【浏览器能识别的标签1】
3.【浏览器能识别的标签2】
4.【浏览器能识别的标签3】
5.【浏览器能识别的标签4】
6.【案例1:用户注册】
7.【案例2:用户注册改进】
8.【快速了解 CSS】
9.【常用选择器概念讲解】
10.【CSS基础样式介绍1】
11.【CSS基础样式介绍2】
12.【CSS基础样式介绍3】
13.【CSS基础样式介绍3】
14.【案例 小米商城头标】
15.【案例 小米商城头标总结】
16.【案例 小米商城二级菜单】
17.【案例 商品推荐部分】
18.【伪类简单了解】
19.【position】
20.【案例 小米商城中app图标代码】
21.【边框及总结】
22.【BootSrap初了解】
23.【BootSrap的目录栏】
24.【BootSrap的栅格系统】
25.【案例 博客案例】
26.【案例 登录】
27.【案例 后台管理样例】
28.【图标】
29.【BootStrap依赖】
30.【javascript初了解】
31.【jJavaScript的变量】
32.【JavaScript的字符串类型】
33.【JavaScript的数组介绍】
34.【案例 动态数据】
35.【javascript 对象(字典)】
36.【案例 动态表格】
37.【Javascript的条件语句和函数】
38.【DOM初了解】
39.【DOM的事件了解】
40.【jQuery初了解】
41.【jQuery寻找标签】
42.【jQuery寻找标签2】
43.【jQuery寻找标签(间接寻找)】
44.【案例 菜单的切换】
45.【案例 只能打开一个菜单】
46.【jQuery 简单操作】
47.【案例 动态创建数据】
48.【案例 点击获取文本】
49.【案例 点击删除文本】
50.【案例 表格操作】
51.【案例 添加页面】
52.【初识MySQL】
53.【MySQL命令介绍一】
54.【MySQL命令介绍二】
55.【MySQL命令介绍三】
56.【案例:员工管理】
57.【案例 Flask+MySQL新增用户】
58.【案例 Flask+MySQL查询所有用户】
59.【初识 django】
60.【django的快速上手】
61.【django的模板语法】
62.【django的获取请求与响应】
63.【案例 用户登录】
64.【django中数据库操作】
65.【django中数据库操作–创建与删除表】
66.【django中数据库操作–操作表中的数据】
67.【案例 用户管理】
68.【A 案例: 员工管理系统1】
69.【A 案例: 员工管理系统2】
70.【A 案例: 员工管理系统3】
71.【A 案例: 员工管理系统4】
72.【A 案例: 员工管理系统5】
73.【A 案例: 员工管理系统6】
74.【A 案例: 员工管理系统7】
75.【A 案例: 员工管理系统8】
76.【A 案例: 员工管理系统9】
77.【A 案例: 员工管理系统10】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值