Python实现员工管理系统(Django页面版 ) 七

        各位小伙伴们好久不见,2024年即将到来,小编在这里提前祝大家新的一年快快乐乐,能够事业有成,学习顺心,家庭和睦,事事顺利。

        今天我们本篇要实现的是一个登录界面的实现,其实登录界面的实现看着挺好实现的,其实里面需要注意到的点还是很多的,因此我可能会需要多篇博客进行一个讲解,接下来我们开始本次的登录界面的实现。

         大家可以从上面的登录界面可以发现,我们本次需要完成的是用户在输入账号和密码后,然后再输入一个验证码后点击登录就能进入到我们的界面中,在这里我们用户输入的账号和密码是与我们上一篇博客是挂钩的,如果有不明白的朋友可以去看一下。

Python实现员工管理系统(Django页面版 ) 六-CSDN博客

        其次我们对于不同的等级的用户进去是需要展示不同的页面的,就比如员工他就只能看看他的同事是哪些,还有他的任务是什么,他也不能进行添加,删除,修改操作,其实这个板块是属于用户权限的划分,我们在本章博客先不做这个,我们把这个伏笔埋一下。        

        好好好,也不多说这么多啦,咱先把基础的模板搞定,到哪步咱再说哪步。

        在之前我们都是使用model.ModelFrom来对数据库中的数据进行一个修饰,一般来讲我们在对数据进行操作的时候我们用这个是比较方便的,那对于我们并不需要对数据库的数据进行操作的时候我们有没有更简单的方式来解决呢,下面我们来介绍一下model.Form。

model.form是Django中的一个模块,用于创建和处理表单。它是一个基于Model的表单,可以很方便地与数据库模型进行交互。

        下面我们在我们的views文件夹下,新建一个login.py

        我们可以从最上面的展示效果来看,我们需要三个字段,分别是用户名,密码和验证码,因此我们需要新建一个Form类来创建这三个字段。

login.py

from django import forms
from project_manage.utils.encryption import md5class LoginForm(forms.Form):username = forms.CharField(label='用户',widget=forms.TextInput(attrs={'class':'from-control','autocomplete':'off'}))password = forms.CharField(label='用户',widget=forms.PasswordInput(attrs={'class':'from-control','autocomplete':'off'}))code = forms.CharField(label='验证码',widget=forms.TextInput(attrs={'class':'from-control','autocomplete':'off'}))def clean_password(self):pwd = self.cleaned_data.get('password')return md5(pwd)

          其中的md5是我们在上一篇博客中对密码的一个加密函数,不了解的朋友可以去看一下。我们会发现其实Form和ModelForm的使用方式是差不多的,只是Form我们用的更加简单。那个钩子方法会将我们输入的密码进行一个md5加密并返回给数据库。

        下面我们来编写我们的模块函数,由于这次的登录界面对比之前的那些模板方法可能比较难理解,我就分开写方便大家理解。

首先我们在访问登录界面是一个get请求访问,那他就会给我们返回一个登录界面的展示

login.py

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

在模板文件中创建一个login.html文件

login,html

{% load static %}
<html lang="en">
<head><meta charset="UTF-8"><title>登录页</title><link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}"><style>.account {width: 450px;border: 2px solid #2196f300;background-color: #fff8d240;margin-left: auto;margin-right: auto;border-radius: 5%;padding: 20px;margin-top: 50px;box-shadow: 7px 11px 5px #9e9e9e;}</style>
</head>
<body">
<div class="account"><form method="post" novalidate>{% csrf_token %}<div class="form-group"><label>账号</label>{{ form.username }}<span style="color: red">{{ form.username.errors.0 }}</span></div><div class="form-group"><label>密码</label>{{ form.password }}<span style="color: red">{{ form.password.errors.0 }}</span></div><div class="form-group"><div class="row"><div class="col-xs-7"><label>验证码</label>{{ form.code }}<span style="color: red">{{ form.code.errors.0 }}</span></div><div class="col-xs-5"><button style="border: none"><img src="/image/code/"></button></div></div></div><button type="submit" class="btn btn-success">登录</button></form>
</div></body>
</html>

          下面我们先对验证码进行一个处理,验证码其实就是往我们的页面插入一张图片,然后让用户进行输入图片中的信息即可,如果输入错误提示验证码错误。

在utils文件夹下创建一个code.py用于存放验证码

code.py

# -*- coding:utf-8 -*-
from PIL import Image,ImageDraw,ImageFont
from random import randint,choicedef create_captcha_content():# 创建一张图片,模式为RGB模式  全白img = Image.new(mode='RGB',size=(110,40),color=(255,255,255))# 创建一个画笔draw = ImageDraw.Draw(img,mode='RGB')# 设置字体font = ImageFont.truetype(r'C:\Windows\Fonts\simhei.ttf',size=30)# 选择图片内容text = 'ABCDEFG123456789'captcha_text = ''for i in range(4):captcha_text += choice(text)x = 15for i in captcha_text:R = randint(0,255)G = randint(0,255)B = randint(0,255)draw.text((x, 3),text=i,font=font,fill=f"rgb({R},{G},{B})")# 调整下一个字的间隔x += 20# 在图像中展示线段作为干扰用户输入数据的方式for i in range(1, randint(3,6)):x1, y1 = randint(0,100),randint(0,30)x2, y2 = randint(0,100),randint(0,30)R = str(randint(0,255))G = str(randint(0,255))B = str(randint(0,255))draw.line((x1,y1,x2,y2),fill=f'rgb({R},{G},{B})',width=2)# 在图像中展示散点作为干扰用户输入数据的方式for i in range(1,randint(100,150)):x1,y1 = randint(0,100),randint(0,30)R = str(randint(0,255))G = str(randint(0,255))B = str(randint(0,255))draw.point((x1,y1),fill=f'rgb({R},{G},{B})')# 返回图像和验证码return [img,captcha_text]

        在这里就不对里面的代码进行解释了,不过需要注意的是对于字体的选择我是使用电脑自带的字体,下面我开介绍一下如何使用电脑自带的字体。

进入C盘 ----》 打开Windows文件   找到Fonts文件夹

然后进去后随便找一个觉得合适的字体,然后右击选择属性,找到文件的路径即可

 

好的,现在回到我们的模块函数

        我们需要将把验证码通过图像的形式插入到我们的界面中去,因此我们需要封装我们的验证码模块函数,我们在进行页面刷新的时候验证码也能跟着刷新

login.py

from io import BytesIO
def image_code(request):image,text = create_captcha_content()# 将验证码的值放入到session中request.session['image_code'] = text# 60s的时效性request.session.set_expiry(60)stream = BytesIO()image.save(stream,'png')return HttpResponse(stream.getvalue())

        其中的session是我们用户和服务器之间的一个会话,我们可以将用户的一些信息放入到这个session中,方便我们服务器进行后续的判断查找。然后我们会在里面设置一个时效性,类似与cookie,在这段时间后服务器就会将该用户信息删除,如果服务器检查到存在该用户的信息的话,那么用户下次进入时就不用进行登录。

配置验证码路由  

urls.py

    # 验证码path('image/code/',login.image_code),

        我们在进行用户登录的时候,首先是需要验证我们输入的验证码是否与图像展示的验证码一样,然后再到数据库中校验是否存在这个用户,存在即返回界面,不存在就给出错误信息。

login.py

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():# 验证码验证user_input_code = form.cleaned_data.pop('code')# 没有值设置为空code = request.session.get('image_code','')# 对于验证码不区分大小写if user_input_code.upper() != code.upper():form.add_error('code','验证码错误')return render(request,'login.html',{'form':form})# 账号密码验证,数据库校验admin_object = models.Admin.objects.filter(**form.cleaned_data).first()if not admin_object:# print(form.cleaned_data)form.add_error('password','用户名或者密码错误')return render(request,'login.html',{'form':form})# 生成字符串存储到cookie和session当中去info = {'id':admin_object.id,'name':admin_object.username,'role':admin_object.role}request.session['info'] = info# 时效性           ------ 一个点request.session.set_expiry(60 * 60 * 24)# request.session.set_expiry(10)return redirect('/')return render(request,'login.html',{'form':form})

  用户退出模块函数

def logout(request):request.session.clear()return redirect('/login/')

        其实用户退出很简单,只需要把用户当前的session清空即可,然后返回到登录界面

配置路由

urls

    # 登录页面path('login/',login.login),# 退出登录path('logout/',login.logout),

        其实做到这里差不多登录界面就完成了,但是里面还没有做到用户权限的划分,我们在后面的博客进行讲解吧。最后,还是祝大家新的一年快乐!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/309524.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【linux】Linux管道的原理与使用场景

Linux管道是Linux命令行界面中一种强大的工具&#xff0c;它允许用户将多个命令链接起来&#xff0c;使得一个命令的输出可以作为另一个命令的输入。这种机制使得我们可以创建复杂的命令链&#xff0c;并在处理数据时提供了极大的灵活性。在本文中&#xff0c;我们将详细介绍Li…

nacos入门篇001-安装与启动

1、下载zip包 我这里下载的是版本2.2.0 Nacos 快速开始 2、修改配置文件 2.1集群模式修改成单例模式 vi startup.sh 2.2 修改数据库配置信息 3、初始化数据库 3.1 创建db名称&#xff1a;db_nacos 3.2 执行mysql-schema.sql 3.3 执行完截图&#xff1a; 4、运行脚本启动 …

Chapter 7 - 8. Congestion Management in Ethernet Storage Networks以太网存储网络的拥塞管理

Stomped CRC Counters Stomped CRC counters help in finding the location of bit errors in a network that uses cut-through switches. More precisely, these counters help in finding where bit errors do not exist. Stomped CRC 计数器有助于在使用直通式交换机的网络…

CSS:盒子模型

CSS&#xff1a;盒子模型 盒子模型盒子模型的组成盒子内容边框 border内边距 padding盒子实际大小计算CSS3的盒子类型content-boxborder-box 外边距 margin外边距合并相邻块元素垂直外边距合并嵌套块元素垂直外边距塌陷 行内元素的内外边距 盒子相关属性圆角边框盒子阴影 盒子模…

APP UI自动化测试思路总结

首先想要说明一下&#xff0c;APP自动化测试可能很多公司不用&#xff0c;但也是大部分自动化测试工程师、高级测试工程师岗位招聘信息上要求的&#xff0c;所以为了更好的待遇&#xff0c;我们还是需要花时间去掌握的&#xff0c;毕竟谁也不会跟钱过不去。接下来&#xff0c;一…

每日一题——LeetCode961

方法一 排序法&#xff1a; 2*n长度的数组里面有一个元素重复了n次&#xff0c;那么将数组排序&#xff0c;求出排序后数组的中间值&#xff08;因为长度是偶数&#xff0c;没有刚好的中间值&#xff0c;默认求的中间值是偏左边的那个&#xff09;那么共有三种情况&#xff1a;…

FFmpeg学习笔记--Centos8安装FFmpeg

1--安装指令 sudo yum install epel-releasesudo yum localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpmsudo yum install ffmpeg ffmpeg-develffmpeg -version 2--版本信息

C/C++ BM3 链表中的节点每k个一组翻转

文章目录 前言题目思路阐述代码总结 前言 这道题的关键是理解链表指针的位置&#xff1b; 在BM2的区间翻转基础上&#xff0c;多了个指针偏移&#xff0c;博客里面我贴图阐述一下。 题目 思路阐述 这道题的翻转过程参考BM2的题解&#xff0c;这里主要阐述一下指针移动和整体思…

JavaScript使用教程(二):类型、值和变量

计算机程序通过操作值&#xff08;如数值3.14&#xff09;或文本&#xff08;如“Hello World”&#xff09;来工作。编程语言中这些可以表示和操作的值被称为类型&#xff0c;而一门语言支持的类型集也是这门语言最基本的特征。程序在需要把某个值保存下来以便将来使用时&…

【Maven】报错合集

问题1&#xff1a;com.github.everit-org.json-schema:org.everit.json.schema:pom:1.12.1 failed to transfer from http://localhost:8081/repository/maven-public/ during a previous attempt 发现原来是maven的settings.xml文件配置出现了问题。首先是之前maven进阶学习时…

亚马逊云科技 re:Invent 2023 产品体验:亚马逊云科技产品应用实践 国赛选手带你看 Elasticache Serverless

抛砖引玉 讲一下作者背景&#xff0c;曾经参加过国内世界技能大赛云计算的选拔&#xff0c;那么在竞赛中包含两类&#xff0c;一类是架构类竞赛&#xff0c;另一类就是 TroubleShooting 竞赛&#xff0c;对应的分别为亚马逊云科技 GameDay 和亚马逊云科技 Jam&#xff0c;想必…

基于Java学生成绩管理系统设计与实现(源码+部署文档+报告)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…