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>

 

posted @ 2022-05-30 20:38  我在春天等伱  阅读(191)  评论(0)    收藏  举报