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 %}