django验证码功能
1.目的
现在我们一般访问网页都需要输入验证码,比如博客园,有的甚至是通过手机验证码实时登录。这样做的目的主要还是为了防止其他人的恶意访问,比如爬虫,下面就来看看验证码是如何实现的
2.StringIO和BytesIO
这两者都是给内存中读写文件使用的
StringIO主要是以字符串的形式在内存中进行读写操作
BytesIO主要是以二进制的形式在内存中进行读写操作
2.1StringIO
from io import StringIO f = StringIO()
f.write('luffy')
f.write(',')
f.write('你好')
print(f.getvalue()) # getvalue,用于获得写入后的str
效果:
2.2BytesIO
from io import BytesIO f = BytesIO()
f.write('luffy'.encode("utf-8"))
f.write('/t'.encode("utf-8")) # 很奇葩的是这里转移符也必须进行编码,否则报错
f.write('你好'.encode("utf-8"))
print(f.getvalue()) # getvalue,用于获得写入后的str
效果:
# 该案例说明转移符也需要进行转换,它也能够转成bytes类型
3.演示
这里我在项目下创建了一个utils文件,存放验证码文件,字体文件下载猛戳这里
utils/code.py
import random
from PIL import Image,ImageDraw,ImageFont,ImageFilter
def check_code(width=120, height=30, char_length=5, font_file='kumo.ttf', font_size=28):
"""
生成一个120*30验证码框体,28字体,字体文件需自己导入
char_length代表生成5个字母
:return:
"""
code = [] # 用于存放每个验证码
img = Image.new(mode='RGB', size=(width, height), color=(255, 255, 255))
draw = ImageDraw.Draw(img, mode='RGB') def rndChar():
"""
生成随机字母A-Z
:return:
"""
return chr(random.randint(65, 90)) def rndColor():
"""
生成随机颜色
:return:
"""
return (random.randint(0, 255), random.randint(10, 255), random.randint(64, 255)) # 写文字
font = ImageFont.truetype(font_file, font_size)
for i in range(char_length):
char = rndChar()
code.append(char) # 循环了char_length次并追加进去
h = random.randint(0, 4)
draw.text([i * width / char_length, h], char, font=font, fill=rndColor()) # 写干扰点
for i in range(40):
draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor()) # 写干扰圆圈
for i in range(40):
draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor())
x = random.randint(0, width)
y = random.randint(0, height)
draw.arc((x, y, x + 4, y + 4), 0, 90, fill=rndColor()) # 画干扰线
for i in range(5):
x1 = random.randint(0, width)
y1 = random.randint(0, height)
x2 = random.randint(0, width)
y2 = random.randint(0, height)
draw.line((x1, y1, x2, y2), fill=rndColor()) img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)
return img, ''.join(code)
views.py
from django.shortcuts import render,HttpResponse,redirect
from django.contrib import auth
# 从utils文件夹下的code文件导入 check_code
from utils.code import check_code def code(request):
"""
生成图片验证码
"""
img,random_code = check_code()
request.session['random_code'] = random_code
from io import BytesIO
# 实现了在内存中操作bytes
stream = BytesIO()
# 将二维码最终转为png格式
img.save(stream, 'png')
return HttpResponse(stream.getvalue()) def login(request):
"""
用户登陆
"""
if request.method == 'GET':
return render(request,'login.html')
user = request.POST.get('user')
pwd = request.POST.get('pwd')
code = request.POST.get('code')
if code.upper() != request.session['random_code'].upper():
return render(request,'login.html',{'msg':'验证码错误'})
# 通过auth模块进行用户认证
user = auth.authenticate(username=user,password=pwd)
if user:
return redirect('https://www.luffycity.com')
return render(request, 'login.html', {'msg': '用户名或密码错误'})
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post">
{% csrf_token %}
<p>
<input type="text" name="user" placeholder="用户名" />
</p>
<p>
<input type="password" name="pwd" placeholder="密码" />
</p>
<p>
<input type="text" name="code" placeholder="验证" />
<img onclick="changeImg(this);" src="/code/" alt="" title="点击更换">
</p>
<input type="submit" value="提交">{{ msg }}
</form>
<script>
// 通过changeImg事件来更换图片
function changeImg(ths) {
ths.src = ths.src + '?';
console.log(ths.src);
}
</script>
</body>
</html>
# 这里每次点击图片,图片就会刷新,这是给url通过get的方式传参数实现改变图片验证码的,通过给/code/添加了一个js实现的
# 至于每次发送get请求为什么后面追加问号,按照我个人理解应该是语法规定,尝试其他字符均会报错
# 对于这里是如何利用random模块实现验证码功能的,详细内容可以参考这里
django验证码功能的更多相关文章
- 探索Django验证码功能的实现 - DjangoStarter项目模板里的封装
前言 依然是最近在做的这个项目,用Django做后端,App上提交信息的时候需要一个验证码来防止用户乱提交,正好我的「DjangoStarter」项目脚手架也有封装了验证码功能,不过我发现好像里面只是 ...
- Django学习笔记(17)——BBS+Blog项目开发(1)验证码功能的实现
本文主要学习验证码功能的实现,为了项目BBS+Blog项目打下基础. 为了防止机器人频繁登陆网站或者破坏分子恶意登陆,很多用户登录和注册系统都提供了图形验证码功能. 验证码(CAPTCHA)是“Com ...
- 使用JS来实现验证码功能
最近想为自己的Django博客添加验证码功能,本来想使用第三方库来实现的,不过考虑到添加第三方库对性能的影响,以及第三方库是否安全可靠的问题,还是用自己的代码来实现吧.反正用JS来实现验证码功能又不是 ...
- django 验证码实现
django验证码的使用: 验证码的作用:用于人机识别. 验证码 ###验证码: def code_str(request): from PIL import Image from PIL impor ...
- django 用户注册功能实现
增加views的类 class RegisterView(View): def get(self, request): return render(request, 'register.html', ...
- dd——留言板再加验证码功能
1.找到后台-核心-频道模型-自定义表单 2.然后点击增加新的自定义表单 diyid 这个,不管他,默认就好 自定义表单名称 这个的话,比如你要加个留言板还是投诉建议?写上去呗 数据表 这个不要碰, ...
- .Net Core 之 图形验证码 本文介绍.Net Core下用第三方ZKWeb.System.Drawing实现验证码功能。
本文介绍.Net Core下用第三方ZKWeb.System.Drawing实现验证码功能. 通过测试的系统: Windows 8.1 64bit Ubuntu Server 16.04 LTS 64 ...
- c#实现验证码功能
一.验证码简介 验证码功能一般是用于防止批量注册的,不少网站为了防止用户利用机器人自动注册.登录.灌水,都采用了验证码技术.所谓验证码,就是将一串随机产生的数字或字母或符号或文字,生成一幅图片, 图片 ...
- javaweb实现验证码功能
在javaweb的用户注册与登陆功能时,有时为了防止漏洞或者大量注册,可以使用验证码功能,下面是验证码的一个简单实现 验证码类 public class ValiImg extends HttpSer ...
随机推荐
- Silverlight 动态创建Enum
private Type CreateEnum() { List<string> lists = new List<string>(); lists.Add("男&q ...
- pandas DataFrame数据转为list
dfpath=df[df['mm'].str.contains('20180122\d')].values dfplist=np.array(dfpath).tolist()
- Unity Scene Screen.resolutions 分辨率列表
Screen.resolutions 分辨率列表(安卓平台试了不能用此方法,最好用宏定义判断一下平台) C# => public static Resolution[] resolutions; ...
- HTML5中video标签与canvas绘图的使用
video标签的使用 video标签定义视频, 它是html5中的新标签, 它的属性如下(参考自文档): domo01 <!DOCTYPE html> <html lang=&quo ...
- 工作采坑札记:2. Hadoop中MultipleInputs的使用陷阱
1. 背景 近日在一个Hadoop项目中使用MultipleInputs增加多输入文件时,发现相同路径仅会加载一次,导致后续的统计任务严重失真.本博文旨在记录异常的排查及解决方案. 2. 情景重现 ( ...
- [HZOI 2015]树黑白
[题目描述] 给定一棵树,要求维护以下操作: 1.M u 将u节点反色 2.Q u 查询u到所有黑色节点距离和 [输入格式] 第一行n,m 表示节点总数和操作次数 之后n-1行,每行u,v表示两个端点 ...
- Js中parseFloat()方法所产的精度不一致问题
<script language="javascript"> function checkForm(){ var Sum="0.11"; var S ...
- 浅谈SQL Server中的三种物理连接操作(Nested Loop Join、Merge Join、Hash Join)
简介 在SQL Server中,我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge J ...
- iOS UIWebView 和 WKWebView 的 cookie 获取,设置,删除
Cookie简介说到Cookie,或许有些小伙伴会比较陌生,有些小伙伴会比较熟悉.如果项目中,所有页面都是纯原生来实现的话,一般Cookie这个东西或许我们永远也不会接触到.但是,这里还是要说一下Co ...
- mysql-标识列(自增长)
标识列 /* 又称为自增长列 含义:可以不用手动的插入值,系统提供默认的序列值 特点: 1.标识列必须和主键搭配吗?不一定,但要求是一个key,key可以是主键.唯一键.甚至外键(没什么意义) 2.一 ...