django - 管理员登录 | 验证码登录 | 密码md5 加密 | 管理员列表 编辑用户| 确认密码
用户注册 确认密码
1. md5密码加密 :adminpy 代码
from django import forms from django.shortcuts import render, redirect # 输出错误信息 from django.core.exceptions import ValidationError from app import models # 引入自己写的modelform from app.utils.bootsrap import BootstrapModelForm # 引入自己写的加密md5() from app.utils.encrypt import md5 def admin_list(request): response = models.Admin.objects.all() return render(request, 'admin_list.html', {'response': response}) class AdminModelForm(BootstrapModelForm): chong_pwd = forms.CharField( label='确认密码', widget=forms.PasswordInput # 密码被清空 #widget=forms.PasswordInput(render_value=True) # 密码不会被清空 ) class Meta: model = models.Admin fields = '__all__' widgets = { 'pwd': forms.PasswordInput # 密码被清空 #'pwd': forms.PasswordInput(render_value=True) # 密码不会被清空 } # 密码加密 =============== 密码加密 ================ def clean_pwd(self): pwd = self.cleaned_data.get('pwd') return md5(pwd) # 定义一个钩子方法 def clean_chong_pwd(self): chong = md5(self.cleaned_data.get('chong_pwd')) #====== 密码加密 ================ pwd = self.cleaned_data.get('pwd') if chong != pwd: raise ValidationError('密码不一致,重新输入') return chong # 添加数据 def admin_add(request): title = '添加管理员' if request.method == 'GET': form = AdminModelForm() return render(request, 'public.html', {'form': form, 'title': title}) # POST 校验数据 form = AdminModelForm(data=request.POST) if form.is_valid(): form.save() return redirect('/admin/list/') return render(request, 'admin_add.html', {'form': form}) # 删除数据 def admin_detele(request, nid): models.Admin.objects.filter(id=nid).delete() return redirect('/admin/list/') # 编辑数据 def admin_edit(request, nid): # 获取需要修改的对象 row_obj = models.Admin.objects.filter(id=nid).first() if request.method == 'GET': # 获取编辑id 的数据 对象 # instance=row_obj 显示编辑框中的默认值 form = AdminModelForm(instance=row_obj) return render(request, 'admin_edit.html', {'form': form}) # 校验编辑数据 instance=row_obj ->指定需要修改的数据 form = AdminModelForm(data=request.POST, instance=row_obj) if form.is_valid(): form.save() return redirect('/admin/list/') return render(request, 'admin_edit.html', {'form': form})
2. 定义md5 文件 encrypt.py文件
''' MD5 加密 ''' from django.conf import settings import hashlib def md5(data_string): obj = hashlib.md5(settings.SECRET_KEY.encode('utf-8')) obj.update( data_string.encode('utf-8') ) return obj.hexdigest()
验证码登录

1. srtting.py
urlpatterns = [ # 登录页面 path('login/', login.login, name='login'), # 退出注销 path('login_out/', login.login_out, name='login_out'), # 登录时的验证码 path('imge_code/', login.imge_code, name='imge_code'),
2. login.py 代码
from django import forms from django.shortcuts import render, redirect, HttpResponse from app import models from app.utils.bootsrap import BootsrapForm # 引入加密 md5 from app.utils.encrypt import md5 class LoginForm(BootsrapForm): # 用户字段 user = forms.CharField( label='用户名', widget=forms.TextInput, ) # 密码字段 pwd = forms.CharField( label='用户密码', widget=forms.PasswordInput, # required=True, 默认值不能为空 required=True, ) # 验证码字段 code = forms.CharField( label='验证码', widget=forms.TextInput, ) # 输入密码是没有加密的, 定义方法返回密文密码 def clean_pwd(self): pwd = self.cleaned_data.get('pwd') 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(): # --> 验证码检验 开始 # 获取用户输入的验证码 pop() 是为在cleaned_data 去掉code ,验证码不保存数据库中 user_input_code = form.cleaned_data.pop('code') # request.session['imge_code'] = code_string 写入的code code = request.session.get('imge_code', '') if code.upper() != user_input_code.upper(): form.add_error('code', '验证码错误') return render(request, 'login.html', {'form': form}) # <-- 验证码检验 结束 # 注意form 没有 form.save() # form 使用 form.cleaned_data 字典 #print(form.cleaned_data) admin_obj = models.Admin.objects.filter(**form.cleaned_data).first() if not admin_obj: # 添加一个错误提示 form.add_error('pwd', '用户名或密码错误') return render(request, 'login.html', {'form': form}) # 登录成功 随机字符写入浏览器cookie中 写入session # Redis-x64-3.0.504.msi 电脑缺少软件下面代码是无法运行的 request.session["info"] = {'id': admin_obj.id, 'name': admin_obj.user} # 登录成功 设置session 有效时间 7小时 request.session.set_expiry(60 * 60 * 7) return redirect('/admin/list/') return render(request, 'login.html', {'form': form}) # 注销登录 def login_out(request): request.session.clear() return redirect('/login/') # 导入验证码 函数 from app.utils.code import check_code # 导入内存引入模块 from io import BytesIO # 随机生成验证码 def imge_code(request): img, code_string = check_code() #print(code_string) # 将验证阿妈写入session 中 request.session['imge_code'] = code_string # 设置session 超时时间60秒 request.session.set_expiry(60) stream = BytesIO() img.save(stream, 'png') stream.getvalue() return HttpResponse(stream.getvalue())
3. html 代码
{% load static %}
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title> 登录页面 </title>
<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}">
</head>
<body>
<div class="container" style="width: 450px; margin-top: 150px; box-shadow: 2px 2px 15px #666; padding: 30px 50px">
<h2> 用户登录 </h2>
<form method="post" novalidate>
{% csrf_token %}
<div class="form-group">
<label for="exampleInputEmail1">用户名</label>
{{ form.user }} <span style="color: red; font-size: smaller">{{ form.user.errors.0 }}</span>
</div>
<div class="form-group">
<label for="exampleInputPassword1">密码</label>
{{ form.pwd }} <span style="color: red; font-size: smaller">{{ form.pwd.errors.0 }}</span>
</div>
<div class="form-group">
<label for="exampleInputPassword1">验证码</label>
<div class="form-group">
<div class="col-lg-8">
{{ form.code }}<span style="color: red; font-size: smaller">{{ form.code.errors.0 }}</span>
</div>
<div class="form-group col-lg-4">
<img src="/imge_code/" alt="验证码" id="imge_code" style="120px;">
</div>
</div>
</div>
<div class="clearfix"></div>
<button type="submit" class="btn btn-success">登录</button>
</form>
</div>
<script src="{% static 'js/jquery.min.js' %}"></script>
<script src="{% static 'js/bootstrap.min.js' %}"></script>
</body>
</html>

浙公网安备 33010602011771号