如何使用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 ...
随机推荐
- Angular 学习笔记——模块之间的通讯
<!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...
- Solidworks 好的测试题模拟题
题目:按照下图构建草图,注意设置必要的几何约束. 问题: 1.参照下图所示参数时请问其中绿色区域的面积为多少平方毫米? 题目:参照下图绘制草图轮廓,注意图中各线条之间均为相切过渡. 问题: ...
- IOS--苹果各地区开发者支援的电话号码
网页地址: https://developer.apple.com/contact/phone/ 中国区的咨询热线:4006 701 855 邓白氏申请中心的电话(400-6701855)
- 关于Laravel5.2在php5.3.6X和在php7.1.10下的内存溢出
php5.3.6X是编译安装,在debug模式下,频繁报出内存泄露警告 php7.1.10下则不会有此错误. 顺便提下:测试发现ThinkPHP也不会有该内存泄露警告! 希望知道如何解决该问题的童鞋能 ...
- 【Xcode学C-3】if等流程控制、函数的介绍说明标记分组、#include以及LLVM
一.流程控制:if.while和for循环 (1)if括号中面常常遇到推断是否相等的情况,并且新手常常会把==写成=.所以建议的习惯是把常量放在前面.如a==10.写成10==a,这样就不易犯错. ( ...
- IOS压缩解压缩
#import <zlib.h> 压缩 -(NSData *)compressData:(NSData *)uncompressedData { if ([uncompressedData ...
- Spring IOC源代码具体解释之容器初始化
Spring IOC源代码具体解释之容器初始化 上篇介绍了Spring IOC的大致体系类图,先来看一段简短的代码,使用IOC比較典型的代码 ClassPathResource res = new C ...
- 51单片机 | 实现SMC1602液晶屏显示实例
———————————————————————————————————————————— LCD1602 - - - - - - - - - - - - - - - - - - - - - - - - ...
- Android中关于cursor类介绍
使用过 SQLite 数据库的童鞋对 Cursor 应该不陌生,如果你是搞.net 开发你大可以把Cursor理解成 Ado.net 中的数据集合相当于dataReader.今天特地将它单独拿出来谈, ...
- 使用Firebug进行断点调试详解
利用Firebug我们可以非常方便地对网页上的任何JavaScript代码进行断点调试. 首先,使用快捷键F12在当前页面打开Firebug,并切换到脚本选项卡. 其次,我们需要为指定的js代码添加断 ...