最初开始搞用户登录验证的时候感觉没什么难的,不就是增删改查中的查询数据库么,但是还是遇到许多小问题,而且感觉在查询数据库的时候,要把前端的数据一条一条的进行比对,会导致我的代码很丑,而且方式很不智,所以进行了一些优化。

  除此之外,我还加入了验证码的功能,同时使用form表单验证,功能应该是大致完善了。

check_code.py:

#!/usr/bin/python

from PIL import Image,ImageDraw,ImageFont,ImageFilter
import random
import string ttf='C:\Windows\Fonts' def getCheckChar():
ran=string.ascii_letters+string.digits #ascii_letters 生成随机字母(大小写),digits生成数字
check_char=''
for i in range(4):
check_char+=random.choice(ran)
print(check_char)
return check_char def getImg(code):
img=Image.new('RGB',(120,30),(255,255,255))
draw=ImageDraw.Draw(img)
font = ImageFont.truetype('C:\Windows\Fonts\Monaco.ttf', 18)
code=code
color=random.randint(50, 150), random.randint(50, 150), random.randint(50, 150)
for t in range(4):
draw.text((28*t,0),code[t],color,font)
# draw.text((60,0),code,color,font)
#干扰点
chance=min(100, max(0, int(2)))
for w in range(120):
for h in range(30):
tmp = random.randint(0, 100)
if tmp > 100 - chance:
draw.point((w, h), fill=(0, 0, 0))
#干扰线
for i in range(3):
# 起始点
begin = (random.randint(0, 120), random.randint(0, 30))
# 结束点
end = (random.randint(0, 120), random.randint(0, 30))
draw.line([begin, end], fill=(0, 0, 0))
#图形扭曲参数
params = [1 - float(random.randint(1, 2)) / 100,
0,
0,
0,
1 - float(random.randint(1, 10)) / 100,
float(random.randint(1, 2)) / 500,
0.001,
float(random.randint(1, 2)) / 500
]
img = img.transform((120,30), Image.PERSPECTIVE,params, Image.BILINEAR)
img=img.filter(ImageFilter.EDGE_ENHANCE_MORE)
# img.save(''.join(code)+'.jpg','jpeg')
return img if __name__ == '__main__':
code=getCheckChar()
getImg(code)

这个py文件我单独的写出来了,和views.py在同一目录下,作用是生成验证码,包括字符串和图片,要import的模块是pillow,对应的PIL

tty是字体文件,我用的是   Monaco.ttf ,自己下载的,注意要对应好它所在的位置

保存的话,如果你想单独用保存可以使用save方法保存,在views里我直接将图片保存在了内存里。

其他的都是pillow的正常操作了,什么大小啦滤镜啦,不赘述了。

views.py:

from django.shortcuts import render,HttpResponse,redirect
from EMsystem import models
from EMsystem import check_code
from io import BytesIO def getcheck_code(request):
code = check_code.getCheckChar()
img = check_code.getImg(code)
f = BytesIO()
img.save(f, 'PNG')
request.session['check_code']=code
return HttpResponse(f.getvalue()) from django import forms
from django.forms import fields #上传文件用
class FM(forms.Form): #这里要接受后端需要的,不需要的数据不会关注
teacher_id=forms.CharField(error_messages={'required':"不能为空"}) #表单中的name要与变量名一样
password=forms.CharField(
min_length=5,
error_messages={'required':"不能为空",
'min_length':'密码长度不小于5',},
) def login_page(request):
if request.method=="GET":
return render(request,'login.html')
if request.method=='POST':
obj=FM(request.POST)
if obj.is_valid():
print(obj.cleaned_data)
check_dic=models.teacher_list.objects.filter(**obj.cleaned_data).first()
if check_dic is None:
return render(request,'login.html')
else:
checkcode=request.POST.get('checkcode')
if checkcode.upper()==request.session['check_code'].upper():
request.session['userid']=obj.cleaned_data['teacher_id']
request.session['is_login']=True
return render(request,'welcome.html')
else:
return render(request, 'login.html', {'err_checkcode': "验证码错误"})
else:
return render(request,'login.html',{'obj':obj}) def welcome(request):
if request.session.get('is_login',None):
return render(request,'welcome.html')
else:
return redirect('/login/')

视图函数里写了四个函数:

  getcheck_code:作用是生成验证码,同时保存到session中,图片保存到内存里并以HttpResponse提交到前端。

  FM:作用是表单验证,这是django自带的form操作,用于检验前端的数据格式是否正确(前面的博文有介绍)。

  login_page:作用是验证数据库和session中的验证码,这里直接使用了form的两个方法:

    is_valid:检验字段是否正确
    cleaned_data:将正确的结果以字典的形式返回

    拿到cleaned_data之后直接怼到数据库里面filter一下,看是否为空,如果为空说明用户名密码不匹配,否则验证成功

check_dic=models.teacher_list.objects.filter(**obj.cleaned_data).first()

  注意如果遇到session报 " KeyError "的问题就在terminal里执行以下两条命令,然后重启服务就可以了:

python manage.py makemigrations

python manage.py migrate

  welcome:验证通过后访问的主页,如果直接访问该页面的话,会先检查is_login这个session是否为True(有关session的使用方法在前面的博文里)

验证成功之后返回welcome.html

HTML:

login.html:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="login.html" method="POST">
{% csrf_token %}
<p>username: <input type="text" name="teacher_id">{{ obj.errors.userid.0}}</p>
<p>password:<input type="password" name="password">{{ obj.errors.password.0 }}<p>
<p>
验证码: <input type="text" name="checkcode">{{ err_checkcode }}
<span>
<img src="/checkcode.html" onclick="chageCheckcode(this)">
</span>
</p>
<input type="submit" value="login"> </form> <script src="/static/jquery-1.12.4.js"></script>
<script>
function chageCheckcode(ths) {
console.log(ths.src)
ths.src=ths.src+'?'
}
</script>
</body>
</html>

urls.py:

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^welcome/',views.welcome),
url(r'^login/',views.login_page),
url(r'^checkcode.html$',views.getcheck_code),
]

这样就实现了登录认证功能

如何使用Django实现用户登录验证的更多相关文章

  1. django 从零开始 8 用户登录验证 待测

    看文档 djang 自带一个用户登录验证的方法,不过有些看着懵逼,去网上找了一圈,发现很多都是照抄文档说明的,几乎没说啥原理 特别是 from django.contrib.auth import a ...

  2. djangorestframework-jwt自带的认证视图进行用户登录验证源代码学习

    Django REST framework JWT djangorestframework-jwt自带的认证视图进行用户登录验证源代码学习 SECRET_KEY = '1)q(f8jrz^edwtr2 ...

  3. cookie实现用户登录验证

    cookie实现用户登录验证 1, INSTALLED_APPS中注册app03 2,在主程序中新建映射关系到app3的url中 from django.conf.urls import url,in ...

  4. django自定义实现登录验证-更新版

    django自定义实现登录验证 django内置的登录验证必须让开发者使用django内置的User模块,这会让开发者再某些方面被限制住 下面的模块是我自己自定义实现的django验证,使用方式和dj ...

  5. android loginDemo +WebService用户登录验证

        android loginDemo +WebService用户登录验证 本文是基于android4.0下的loginActivity Demo和android下的Webservice实现的.l ...

  6. Python程序练习1-模拟用户登录验证

    1.功能简介 此程序模拟用户登录验证的过程,实现用户名输入.黑名单检测.用户有效性判别.密码输入及验证等.用户在3次以内输入正确密码登陆成功,连续输错3次密码登陆失败,且该用户名被记录在黑名单,黑名单 ...

  7. Django:用户登录实例

    Django:用户登录实例 一.源代码 1,login.html代码(登录界面): <!DOCTYPE html> <html lang="zh-CN"> ...

  8. python3 用户登录验证的小功能

    用户登录验证,记录一下,还需要修改黑名单不合理 #!/usr/bin/env python3 ''' 需求:编写登录接口 1.输入用户名和密码 2.验证用户密码成功后输出欢迎消息 3.3次没有验证通过 ...

  9. 用javascript实现简单的用户登录验证

    用javascript实现简单的用户登录验证 <!DOCTYPE html> <html lang="en"> <head> <meta ...

随机推荐

  1. Angular 学习笔记——模块之间的通讯

    <!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...

  2. Solidworks 好的测试题模拟题

    题目:按照下图构建草图,注意设置必要的几何约束. 问题:   1.参照下图所示参数时请问其中绿色区域的面积为多少平方毫米?     题目:参照下图绘制草图轮廓,注意图中各线条之间均为相切过渡. 问题: ...

  3. IOS--苹果各地区开发者支援的电话号码

    网页地址: https://developer.apple.com/contact/phone/ 中国区的咨询热线:4006 701 855 邓白氏申请中心的电话(400-6701855)

  4. 关于Laravel5.2在php5.3.6X和在php7.1.10下的内存溢出

    php5.3.6X是编译安装,在debug模式下,频繁报出内存泄露警告 php7.1.10下则不会有此错误. 顺便提下:测试发现ThinkPHP也不会有该内存泄露警告! 希望知道如何解决该问题的童鞋能 ...

  5. 【Xcode学C-3】if等流程控制、函数的介绍说明标记分组、#include以及LLVM

    一.流程控制:if.while和for循环 (1)if括号中面常常遇到推断是否相等的情况,并且新手常常会把==写成=.所以建议的习惯是把常量放在前面.如a==10.写成10==a,这样就不易犯错. ( ...

  6. IOS压缩解压缩

    #import <zlib.h> 压缩 -(NSData *)compressData:(NSData *)uncompressedData { if ([uncompressedData ...

  7. Spring IOC源代码具体解释之容器初始化

    Spring IOC源代码具体解释之容器初始化 上篇介绍了Spring IOC的大致体系类图,先来看一段简短的代码,使用IOC比較典型的代码 ClassPathResource res = new C ...

  8. 51单片机 | 实现SMC1602液晶屏显示实例

    ———————————————————————————————————————————— LCD1602 - - - - - - - - - - - - - - - - - - - - - - - - ...

  9. Android中关于cursor类介绍

    使用过 SQLite 数据库的童鞋对 Cursor 应该不陌生,如果你是搞.net 开发你大可以把Cursor理解成 Ado.net 中的数据集合相当于dataReader.今天特地将它单独拿出来谈, ...

  10. 使用Firebug进行断点调试详解

    利用Firebug我们可以非常方便地对网页上的任何JavaScript代码进行断点调试. 首先,使用快捷键F12在当前页面打开Firebug,并切换到脚本选项卡. 其次,我们需要为指定的js代码添加断 ...