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

  除此之外,我还加入了验证码的功能,同时使用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. 2016.3.16__HTML5新特性__第八天

    HTML 5 + CSS 3 假设您认为这篇文章还不错,能够去H5专题介绍中查看很多其它相关文章. 今日代码非常冗杂,所以非常多内容直接摘自网上,假设造成您的不适.请留言告知. 非常感谢. 输入标签, ...

  2. VB,Visual Basic如何修改代码文本大小和字体

    工具-选项-编辑器格式   修改之后效果如图所示

  3. How to Configure an SSIS Package to Access a Web Service using WCF

    This information is from:http://blogs.msdn.com/b/dbrowne/archive/2010/07/08/how-to-configure-an-ssis ...

  4. react-native AsyncStorage 数据持久化方案

    1,AsyncStorage介绍 AsyncStorage 是一个简单的.异步的.持久化的 Key-Value 存储系统,它对于 App 来说是全局性的.它用来代替 LocalStorage. 由于它 ...

  5. 拒绝IP登陆

    tail -n 30 /var/log/messages 发现很多IP尝试登陆,直接封禁. 解决方案:1. vi /etc/hosts.allow 添加 sshd:143.63.182.238 [注意 ...

  6. 安卓使用Socket发送中文,C语言服务端接收乱码问题解决方式

    今天用安卓通过Socket发送数据到电脑上使用C语言写的服务端,发送英文没有问题,可当把数据改变成中文时,服务端接收到的数据确是乱码. 突然想到.VS的预处理使用的是ANSI编码.而安卓网络数据都是U ...

  7. 【BIEE】10_资料库查看数据报错

    导入元数据后,在资料库右键物理表名,[查看数据]报错: 出现这个问题,没搞明白是为啥- 后来百度意外发现一个方法,修改NQSConfig.INI文件即可解决问题 那么就开始来搞定这个问题 [1]打开路 ...

  8. R 介绍

    R定义:一个能够自由有效地用于统计计算和绘图的语言和环境,它提供了广泛的统计分析和绘图技术. R语言的使用很大程度上可以说是借助各种各种各样R包的辅助,从某种程度上说,运用R的插件来满足不同的需求. ...

  9. AOP切面编程在android上的应用

    代码地址如下:http://www.demodashi.com/demo/12563.html 前言 切面编程一直是一个热点的话题,这篇文章讲讲一个第三方aop库在android上的应用.第三方AOP ...

  10. java调用本地默认浏览器

    1 http://blog.csdn.net/casularm/article/details/3401018 2