如何使用Django实现用户登录验证
最初开始搞用户登录验证的时候感觉没什么难的,不就是增删改查中的查询数据库么,但是还是遇到许多小问题,而且感觉在查询数据库的时候,要把前端的数据一条一条的进行比对,会导致我的代码很丑,而且方式很不智,所以进行了一些优化。
除此之外,我还加入了验证码的功能,同时使用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实现用户登录验证的更多相关文章
- django 从零开始 8 用户登录验证 待测
看文档 djang 自带一个用户登录验证的方法,不过有些看着懵逼,去网上找了一圈,发现很多都是照抄文档说明的,几乎没说啥原理 特别是 from django.contrib.auth import a ...
- djangorestframework-jwt自带的认证视图进行用户登录验证源代码学习
Django REST framework JWT djangorestframework-jwt自带的认证视图进行用户登录验证源代码学习 SECRET_KEY = '1)q(f8jrz^edwtr2 ...
- cookie实现用户登录验证
cookie实现用户登录验证 1, INSTALLED_APPS中注册app03 2,在主程序中新建映射关系到app3的url中 from django.conf.urls import url,in ...
- django自定义实现登录验证-更新版
django自定义实现登录验证 django内置的登录验证必须让开发者使用django内置的User模块,这会让开发者再某些方面被限制住 下面的模块是我自己自定义实现的django验证,使用方式和dj ...
- android loginDemo +WebService用户登录验证
android loginDemo +WebService用户登录验证 本文是基于android4.0下的loginActivity Demo和android下的Webservice实现的.l ...
- Python程序练习1-模拟用户登录验证
1.功能简介 此程序模拟用户登录验证的过程,实现用户名输入.黑名单检测.用户有效性判别.密码输入及验证等.用户在3次以内输入正确密码登陆成功,连续输错3次密码登陆失败,且该用户名被记录在黑名单,黑名单 ...
- Django:用户登录实例
Django:用户登录实例 一.源代码 1,login.html代码(登录界面): <!DOCTYPE html> <html lang="zh-CN"> ...
- python3 用户登录验证的小功能
用户登录验证,记录一下,还需要修改黑名单不合理 #!/usr/bin/env python3 ''' 需求:编写登录接口 1.输入用户名和密码 2.验证用户密码成功后输出欢迎消息 3.3次没有验证通过 ...
- 用javascript实现简单的用户登录验证
用javascript实现简单的用户登录验证 <!DOCTYPE html> <html lang="en"> <head> <meta ...
随机推荐
- [CSS3]移动Web开发系列之CSS3增强型选择器
css3是移动Web开发的主要技术之中的一个.当前.CSS3技术最适合在移动Web开发中使用的特性有增强的选择器.阴影.强大的背景设置 .圆角边框 接下来我们主要解说增强型的选择器.主要分两种,属性选 ...
- Codeforces Round #254 (Div. 2) B (445B)DZY Loves Chemistry
推理可得终于结果为2的(n-可分组合数)次方. 问题是怎么求出可分组合数,深搜就可以,当然并查集也能够. AC代码例如以下: 深搜代码!!! #include<iostream> #inc ...
- Kafka备忘
官网 http://kafka.apache.org/ 多生产者多消费者 多topic和多分区 多消费者组.每组中消息不能重复消费,组间不影响 启动 RunKafka(){ cd $kafka_hom ...
- 初窥Servlet
1. Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术.sun公司在其API中提供了一个servlet接口,用户若想要发一个动态web资源,只需要完成以下两步即可: ...
- Linux服务器重启后启动Oracle服务
目录 1. 启动Oracle服务 2. 启动Oracle监听服务 © 版权声明:本文为博主原创文章,转载请注明出处 1. 启动Oracle服务 重启Linux服务器后,Oracle服务还需要手动启动. ...
- 用第三方下载工具下载官方XCode独立安装包的方法
用第三方下载工具下载官方XCode独立安装包的方法 下载步骤 下载 aria2 工具配置好并启动 (利用其支持配置Cookie并多线程下载的功能.而迅雷则不支持设置Cookie,所以不支持这种需要登录 ...
- fedora20配置静态ip
在linux的世界里.给主机设置固定ip是这么做的(使用root用户): 1.查看要配的网络接口 用ifconfig查看查看在用的网卡接口,一般都用第一个如:eth0,en1,em1等 2.停用网络自 ...
- iOS引用当前显示的UIAlertView
UIAlertView在iOS里和一般的UIView不一样,有时候使用起来会有一些不便.特别要引用当前显示的UIAlertView的时候,就存在一些难度. 在iOS7以前,可以下面的代码可以解决这个问 ...
- android 小游戏之数字猜猜
http://www.cnblogs.com/whatbeg/p/4152333.html
- Android分享图片失败解决方案
前言:在做图片分享到微博或是用彩信分享的时候,会遇到“无法将图片添加到信息中”,其实这个问题的原因是创建的那个图片默认是,只能被当前应用调用,无法被其他应用调用,即分享的时候,无法读取到图片,并提示I ...