Django 管理员-密码验证

md5加密

  • 密码不能保存明文 (md5加密)
  • 创建用户密码时,两次密码需要匹配(钩子方法比较)

Python内置哈希库对字符串进行MD5加密,先导入MD5加密所需模块

import hashlib  # 导入hash库函数

创建md5对象,并加密

# 待加密信息
str = '123456'
# 创建md5对象
hl = hashlib.md5()
hl.update(str.encode("utf-8"))
print('MD5加密前为 :' + str)
# hexdigest()返回的是一个十六进制字符串
print('MD5加密后为 :' + hl.hexdigest())

例:

# 导入
import hashlib

def md5_encrypthion(data):
    # 创建md5对象
    encry_data = hashlib.md5()
    # updata方法更新md5对象的值
    encry_data.update(data.encode('utf-8'))
    # hexdigest()返回的是一个十六进制字符串
    return encry_data.hexdigest()

data = "hello, Python"
encry_result = md5_encrypthion(data)
print(f'encry_result: {encry_result}')

新建管理员

包含密码验证

models.py

""" 管理员 """
class Admin(models.Model):
    username = models.CharField(verbose_name='用户名', max_length=32)
    password = models.CharField(verbose_name='密码', max_length=64)

urls.py

# 管理员
path('employee/admin/list/', views.admin_list),
path('employee/admin/add/', views.admin_add),

创建md5加密模块文件 encrypt.py

from django.conf import settings
import hashlib


def md5(data_string):
    # 增加盐  django自动生成的字符串,在settings文件里
    # settings.SECRET_KEY.encode('utf-8')
    # 创建md5对象
    obj = hashlib.md5(settings.SECRET_KEY.encode('utf-8'))
    # update方法更新obj对象,utf-8的编码
    obj.update(data_string.encode('utf-8'))
    # hexdigest()返回的是一个十六进制字符串
    return obj.hexdigest()

views.py

""" 密码验证 """
from django import forms
from django.core.validators import ValidationError
# 导入自定义的加密模块
from sainfo.Utils.encrypt import md5

class AdminModelForm(forms.ModelForm):
    # 可以新定义一个字段,验证密码
    confirm_password = forms.CharField(
        label='确认密码',
        # render_value=True 密码输入框不正确时,不置空,保留错误信息
        widget=forms.PasswordInput(render_value=True),
    )

    class Meta:
        model = models.Admin
        fields = ['username', 'password', 'confirm_password']
        # 对某个字段进行修改
        widgets = {
            'password': forms.PasswordInput(render_value=True),
        }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for name, field in self.fields.items():
            if field.widget.attrs:
                field.widget.attrs['class'] = "form-control"
            else:
                field.widget.attrs = {
                    "class": "form-control",
                    # "placeholder": field.label
                }

    # md5加密第一次输入密码
    def clean_password(self):
        pwd = self.cleaned_data.get('password')
        # 导入自定义模块 from sainfo.Utils.encrypt import md5
        # 进行加密
        # 返回什么,此字段以后保存到数据库就是什么
        # 使用md5模块进行加密
        return md5(pwd)

    # 定义钩子方法验证两次输入密码是否一致
    def clean_confirm_password(self):
        # cleaned_data 就是读取表单返回的值,返回类型为字典dict型
        pwd = self.cleaned_data.get('password')
        # # 使用md5模块进行加密
        confirm = md5(self.cleaned_data.get('confirm_password'))
        # 拿到第一次输入的密码和第二次输入的密码
        print(self.cleaned_data)
        if pwd != confirm:
            raise ValidationError("密码不一致")
        # 返回什么,此字段以后保存到数据库就是什么
        return confirm


def admin_add(request):
    """ 增加管理员 """

    if request.method == 'GET':
        form = AdminModelForm()
        context = {
            'title': '增加管理员',
            'form': form,
        }
        return render(request, 'change.html', context=context)
    else:
        form = AdminModelForm(data=request.POST)
        if form.is_valid():
            # cleaned_data 就是读取表单返回的值,返回类型为字典dict型
            print("验证通过的数据:", form.cleaned_data)
            form.save()
            return redirect('/employee/admin/list/')
        else:

            context = {
                'title': '增加管理员',
                'form': form,
            }
            return render(request, 'change.html', context=context)

change.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
</html>{% extends 'layout.html' %}

{% block content %}

    <div class="container">
        <div class="panel panel-default">
            <div class="panel-heading">
                <h3 class="panel-title">{{ title }}</h3>
            </div>
            <div class="panel-body">
                {#  同行显示  <form class="form-inline">#}
                {#    novalidate  关掉浏览器校验#}
                <form method="post" novalidate >
                    {% csrf_token %}
                    {#    form 是 views传过来的对象,也是ModelForm自动生成的html内容#}
                    {% for field in form %}

                        <div class="form-group">
                            {#        field  是循环后得到的每一个字段的 input框#}
                            {#        filed.label 就是 字段的 verbose_name#}
                            <label>{{ field.label }}:</label>
                            {#    <input type="text" ....................>#}
                            {{ field }}
                            {#    错误信息#}
                        <span style="color: red">{{ field.errors }}</span>
                        </div>

                    {% endfor %}

                    <button type="reset" class="btn btn-primary btn-sm">
                        <span class="glyphicon glyphicon-remove-circle" aria-hidden="true"></span>
                        Reset
                    </button>
                    <button type="submit" class="btn btn-primary btn-sm">
                        <span class="glyphicon glyphicon-ok-circle" aria-hidden="true"></span>
                        Submit
                    </button>

                </form>
            </div>
        </div>
    </div>

{% endblock %}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值