Python中Django验证码功能的实现代码

  

为了防止机器人频繁登陆网站或者破坏分子恶意登陆,很多用户登录和注册系统都提供了图形验证码功能。

  

验证码(验证码)是“的全自动区分计算机和人类的图灵测试”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。可以防止恶意破解密码,刷票,论坛灌的水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试。

  

图形验证码的历史比较悠久,到现在已经有点英雄末路的味道了。因为机器学习,图像识别的存在,机器人已经可以比较正确的识别图像内的字符了。但不管怎么说,作为一种防御手段,至少还是可以抵挡一些低级入门的攻击手段,抬高了攻击者的门槛。

  

  

<强> 1,验证码前端画布页面生成

  

那么下面我们将依次生成验证码这种画布,左边框是输入验证码的内容,右边框是设计验证码。

  

1.1,直接读取图片

  

首先,我们需要了解读取图片的方法。

  

这样我们知道方法就行,不建议使用,因为这样读取文件,我们需要存很多文件。

  

1.2,硬盘操作

  

首先,我们需要导入库,图像处理库枕头,如果没有的话,需要先安装枕头库。

  

其次,我们创建一个定义随机颜色方法的函数。这函数的意义就是定义画布的背景颜色。

  

如何定义颜色随机呢?,因为三原色R, G, B的范围都是0 - 255,我们随机取0 - 255里面的某一个整数,就得到了随机颜色。代码如下:

  

然后我们设定画布的大小,定义画布的宽和高,然后写一块区域,最后展示在前端页面。

  

1.3,内存操作

  

其实硬盘操作,我们也不建议使用,最好的方法是建议使用内存操作。在上线中大多体验者需要的是速度,如果速度不够快,那就会放弃这个应用,所以我们一般牺牲其空间复杂度,换取时间复杂度。

  

那内存操作如何做呢?首先,我们获取一个缓存区,然后将图片保存到缓存区,最后使用一个.getvalue的函数方法将缓存区的内容返回给前端。

  

.getvalue是把缓存区的所有数据读取。

  

bytesIO()是使用io获取一个缓存区,然后将图片保存到缓存区,最后读取缓存区的数据。

  

这样的话,一个前端画布就生成了,不仅生成了,我们还解决了速度问题,而且每次刷新,后台都会传出不同颜色的画布。

  

1.4效果图

  

验证码在前端显示,肯定是左边一格,右边一格。最后设计出来的画布效果是这样的。

  

 Python中Django验证码功能的实现代码

  

那下面,我们需要给画布里面添加文字了。

  

<强> 2,如何给面板里加文字

  

我们需要导入绘图库ImageDraw,绘图字体库ImageFont。还需要下载一个字体样式,直接使用网上的字体样式会比较简单。

  

2.1, ttf字体下载

  

我们可以在网上下载一个ttf字体文件。选择一个自己喜欢的字体形式,下载。我这里下载了三个,这里我使用第三个Vera.ttf字体。

  

 Python中Django验证码功能的实现代码

  

2.2添加文字

  

一般情况下,验证码都是由四到八位不等的数字,大小写字母组成。我们这里选择五位,其中每个位里面让随机生成一个大写字母,或者小写字母,或者数字,然后将其保存下来。这就是一个简单的验证码就生成了。

  

代码如下:

  

2.3效果图

  

验证码里面添加五个文字,最后设计出来的添加文字的画布效果是这样的。

  

 Python中Django验证码功能的实现代码

  

<强> 3,加上噪点噪线

  

其实上面差不多已经完成了验证码的操作,但是这是比较简单的验证码,一般的图片验证码机器就可以识别了。我们需要添加一些难度,比如噪点噪线。

  

加噪点噪线也是为了减轻暴力请求,一般的图片验证码机器就可以识别出来,所以我们加点难度,这样可以减轻服务器的压力。

  

下面代码中,宽度和高度是前端画布的宽和高,第一个为循环是噪点的加入,第二个为循环是噪线的加入。

  

(x1, y1, x2, y2则表示需要四个坐标。

Python中Django验证码功能的实现代码