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

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

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

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

验证码功能实现方法1——完整的验证码实现流程

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

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

1.1,直接读取图片

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

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

1.2,硬盘操作

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

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

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

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

1.3,内存操作

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

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

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

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

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

1.4 效果图

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

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

2,如何给面板里加文字

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

2.1,ttf字体下载

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

2.2 添加文字

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

  代码如下:

2.3 效果图

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

3,加上噪点噪线

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

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

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

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

3.1 效果图

   验证码里面添加噪点噪线,因为我还要使用,所以噪点噪线的效果就添加了一点点而已,如果需要复杂,可以添加内容就像,最后设计出来的添加噪点噪线的画布效果是这样的。

4,验证码局部刷新

  为什么要做验证码局部刷新呢?从使用者的角度来说,我们也知道,当前端显示的验证码看不清楚,我们就需要刷新一下,但是不可能不停的提交表单,这样的话,服务器的压力就太大了。所以这时候局部刷新就优势就显现出来了,我们需要局部刷新,很多人就想到了Ajax,没错,这是可以用,但是这里说一种比较简单的局部刷新的方法。

  我们可以看一个例子:

  从上面,我们发现可以使用增加字符的方式,实现局部刷新,那么我们也可以采取这么简单的方法,直接刷新验证码就行了。

  下面展示其代码:

  views.py

  前端代码:

5,cookie与session保存验证码

  将随机验证码存储到session中,就是需要记录给哪个请求发了什么验证码。

  为什么这么说呢?因为到时候使用登录验证的使用者不止一个人,那么服务端发送的验证码不记录给哪个请求发送的验证码,当好几个人同时请求验证码信息,然后提交,这样就会发生混淆。所以保险起见,我们使用session保存验证码。

  views.py

  login.html

  index.html

  views.py

  validCode.py

验证码功能实现方法2——captcha

  在Django中实现图片验证码功能非常简单,有现成的第三方库可以使用,我们不必自己开发(但是也需要自己能开发的出来,方法二将自己开发的图片验证码模块)。这个库叫做django-simple-captcha。

1,安装 captcha

  直接使用pip 按照

  

  Django 自动帮我们安装了相关的依赖库 six, olefile 和 pillow ,其中Pillow是大名鼎鼎的绘图模块。

2,注册captcha

  在settings.py中,将'captcha' 注册到APP列表里。

  captcha 需要在数据库中建立自己的数据表,所以需要执行migrate命名生成数据表:

3,添加URL路由

  我们还需要在根目录下的urls.py文件添加 captcha 对应的网址:

4,修改 myforms.py

  如果上面都OK了,就可以直接在MyForms.py文件中添加CaptchaField了。

  注意:我们需要提前导入form captcha.fields import CaptchaField ,然后就像写普通的form字段一样添加一个captcha字段就可以了。

5,HTML文件的使用(修改 login.html文件)

  由于我们这里直接学习验证码,所以我这里直接写一个简单的login.html页面,添加 capthca的相关内容。

  这里额外的添加了一条 {{ login_form.captcha.errors }} 用于明确指示用户,你的验证码不正确。其中验证图形码是否正确的工作都是在后台自动完成的。只需要使用is_valid()这个myforms内置的验证方法就一起进行了,完全不需要再视图函数中添加任何的验证代码,非常方便快捷!

6,查看效果

  直接的效果进入页面的效果如下:

  我们输入错验证码的效果如下:

  当然我们还可以添加多种效果,这里就不做添加了,就实现简单的验证码功能即可。

7,附带的代码

  models.py

  views.py

验证码功能实现方法3——极验验证SDK

一,Django极验滑动验证码的使用

1,官网直接注册账号申请key和value

  极验滑动验证码官网:www.geetest.com

2,从Github: gt3-python-sdk下载.zip文件3,找到里面Django 的文件夹对照官网直接copy4,代码

  views.py

  urls.py

  login.html

知识储备一:pillow模块的学习

  PIL:Python Imaging Library,已经是Python平台上的图像处理标准库了。由于PIL仅支持到Python2.7 ,加上年久失修,于是一群志愿者在PIL的基础上创建了兼容的版本,名字叫Pillow,支持最新版本的Python3.X,又加了许多新特性。因此,我们可以直接安装使用Pillow。

(此处pillow的模块的学习摘抄与网友灬魑魅魍魉灬,如有侵权,请联系我,立删)

1,PIL的基本概念

  PIL中所涉及的基本概念有如下几个:通道(bands)、模式(mode)、尺寸(size)、坐标系统(coordinate system)、调色板(palette)、信息(info)和滤波器(filters)。

1.1 通道

  每张图片都是由一个或者多个数据通道构成。PIL允许在单张图片中合成相同维数和深度的多个通道。

  以RGB图像为例,每张图片都是由三个数据通道构成,分别为R、G和B通道。而对于灰度图像,则只有一个通道。

  对于一张图片的通道数量和名称,可以通过方法getbands()来获取。方法getbands()是Image模块的方法,它会返回一个字符串元组(tuple)。该元组将包括每一个通道的名称。

  Python的元组与列表类似,不同之处在于元组的元素不能修改,元组使用小括号,列表使用方括号,元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。

  方法getbands()的使用如下:

1.2 模式

  图像的模式定义了图像的类型和像素的位宽。当前支持如下模式:

  可以通过mode属性读取图像的模式。其返回值是包括上述模式的字符串。

  属性mode的使用如下:

1.3 尺寸

  通过size属性可以获取图片的尺寸。这是一个二元组,包含水平和垂直方向上的像素数。

  属性mode的使用如下:

1.4 坐标系统

  PIL使用笛卡尔像素坐标系统,坐标(0,0)位于左上角。注意:坐标值表示像素的角;位于坐标(0,0)处的像素的中心实际上位于(0.5,0.5)。

  坐标经常用于二元组(x,y)。长方形则表示为四元组,前面是左上角坐标。例如,一个覆盖800x600的像素图像的长方形表示为(0,0,800,600)。

1.5 调色板

  调色板模式("P")使用一个颜色调色板为每个像素定义具体的颜色值

1.6 信息

  使用info属性可以为一张图片添加一些辅助信息。这个是字典对象。加载和保存图像文件时,多少信息需要处理取决于文件格式。

属性info的使用如下:

1.7 滤波器

  对于将多个输入像素映射为一个输出像素的几何操作,PIL提供了四个不同的采样滤波器。

  Image模块中的方法 resize() 和 thumbnail()用到了滤波器。

  方法resize() 的使用如下:

  对参数filter不赋值的话,方法resize()默认使用NEAREST滤波器。如果要使用其他滤波器可以通过下面的方法来实现:

2,Image模块

  Image模块是PIL中最重要的模块,它有一个类叫做image,与模块名称相同。Image类有很多函数,方法及属性,接下来将依次对image类的属性,函数和方法进行介绍。

2.1 Image类的属性

  1,Format

  2,Mode

  3,Size

  4,Palette

  5,Info

2.2 类的函数

  1,new

  2,Open

  3,Blend

  4,Composite

  5,Eval

  6,Formbuffer

  7,Formstring

  8,Merge

3,Image类的方法

  除非另做说明,Image类的所有方法都将返回一个Image类的新实例,这个实例对应于结果图像。

  1,Convert

  2,Copy

  3,Crop

  4,Draft

  5,Filter

  6,Fromstring

  7,Getbands

  8,Getbbox

  9,Getcolors

  10,Getdata

  11,Getextrema

  12,Getpixel

  13,histogram

  14,load

  15,Paste

二:python中chr() 函数 和 ord() 函数的用法。

1,chr()函数

格式: Chr(<数值表达式>)

说明:chr() 用一个范围在 range(256)内的(就是0~255)整数做参数。函数返回值类型为String,其数值表达式值取值范围为0~255,返回一个对应的字符(对应的ASCII字符)。

例如:Print(Chr(78)) 结果显示:N

65-90 大写A-Z

97-122 小写的a-z

2,ord() 函数

格式: ord("字符串")

说明:函数返回值类型为int

例如:Print(ord('0')) 结果显示:48

总结

以上所述是小编给大家介绍的Python 中Django验证码功能的实现代码,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

(0)

相关推荐

  • Django实现登录随机验证码的示例代码

    登录验证码是每个网站登录时的基本标配,网上也有很多相应的文章, 但是从生成验证码到 应用到自己的网站上的全步骤,并没有看到很多, 为了节约大家的时间,我把整体步骤写下来, 即拿即用哈 1. 生成随机验证码 #_*_coding:utf-8_*_ from PIL import Image,ImageDraw,ImageFont,ImageFilter import random import math, string #字体的位置,不同版本的系统会有不同 font_path = '/Librar

  • django 发送手机验证码的示例代码

    一.流程分析: 1.用户在项目前端,输入手机号,然后点击[获取验证码],将手机号发到post到后台. 2.后台验证手机号是否合法,是否已被占用,如果通过验证,则生成验证码,并通过运行脚本,让短信运营商向该手机号,发送该验证码,如果没通过验证,则返回错误信息 3.用户收到短信验证码以后,再次将所有信息post到后台. 4.后台验证各个数据,通过验证则完成实名制认证,如果没通过则返回错误信息. 总结,一次实名验证,需要两次ajax+post 二.对接短信商: 1.在云片网端: 1.注册云片网 地址:

  • Django框架验证码用法实例分析

    本文实例讲述了Django框架验证码用法.分享给大家供大家参考,具体如下: 验证码 1.作用 在用户登录,注册以及一些敏感操作的时候,我们为了防止服务器被暴力请求,或爬虫爬取,我们可以使用验证码进行过滤,减轻服务器的压力. 验证码需要使用绘图 Pillow pip3 install Pillow 核心API Image 需要模式 尺寸 背景色 ImageDraw 绑定画布 模式 封装了绘制的API text point line arch ImageFont 手动指定字体 2.业务流程 绘制验证

  • Django自定义插件实现网站登录验证码功能

    前言 网站登录的时候我们常常会看到随机的验证码需要输入后台验证,如图: 现在我们来实现在Django中通过自定制插件来实现随机验证 check_code.py 基于PIL生成一个带验证码的图片和验证码,生成验证码图片需要Monaco.ttf字体(重要),可按自己要求更改check_code中的字体和字体文件位置 #!/usr/bin/env python # -*- coding:utf-8 -*- import random from PIL import Image, ImageDraw,

  • Django验证码的生成与使用示例

    前言 本文主要介绍的是关于Django验证码生成与使用的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 方法如下: 1.基于PIL生成一个带验证码的图片和验证码,生成验证码图片需要Monaco.ttf字体,可按自己要求更改check_code中的字体和字体文件位置,如下图 #!/usr/bin/env python # -*- coding:utf-8 -*- import random from PIL import Image, ImageDraw, ImageFont, Im

  • python django 实现验证码的功能实例代码

    我也是刚学Python  Django不久很多都不懂,所以我现在想一边学习一边记录下来然后大家一起讨论! 验证码功能一开始我在网上找了很多的demo但是我在模仿他们写的时候,发现在我的版本上根本就不能运行起来在前端页面显示的时候是图裂,有可能是我用的Python3.5的版本和django是1.10的版本的原因,我看了晚上很多的版本都是2.7的,所以我问了很多前辈和大神,终于发现了原因的所在,好了代码我就在下面帖粗来了. 这是我的项目目录. 验证码要成功显示就必须要有一个验证码生成器,所以就要写一

  • Django框架登录加上验证码校验实现验证功能示例

    本文实例讲述了Django框架登录加上验证码校验实现验证功能.分享给大家供大家参考,具体如下: 验证码生成函数 pip install Pillow # /verify_code def verif_ycode(request): #引入绘图模块 from PIL import Image, ImageDraw, ImageFont #引入随机函数模块 import random #定义变量,用于画面的背景色.宽.高 bgcolor = (random.randrange(20, 100), r

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

    为了防止机器人频繁登陆网站或者破坏分子恶意登陆,很多用户登录和注册系统都提供了图形验证码功能. 验证码(CAPTCHA)是"Completely Automated Public Turing test to tell Computers and Humans Apart"(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序.可以防止恶意破解密码.刷票.论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试. 图形验证

  • 基于Django的python验证码(实例讲解)

    验证码 在用户注册.登录页面,为了防止暴力请求,可以加入验证码功能,如果验证码错误,则不需要继续处理,可以减轻一些服务器的压力 使用验证码也是一种有效的防止crsf的方法 验证码效果如下图: 验证码视图 新建viewsUtil.py,定义函数verifycode 此段代码用到了PIL中的Image.ImageDraw.ImageFont模块,需要先安装Pillow(3.4.1)包, 详细文档参考 http://pillow.readthedocs.io/en/3.4.x/ Image表示画布对象

  • Django 生成登陆验证码代码分享

    环境准备 python3.52 pycharm5.05 Pillow 自制的验证码工具包/utils/check_code 验证码的作用 防恶意破解密码:防止,使用程序或机器人恶意去试密码.为了提高用户的体验,用户输入错误以后,才会要求输入验证码. 防论坛灌水:这个是很常见的.有一种程序叫做顶帖机,如果无限制的刷,整个论坛可能到处是拉圾信息,比如,百度贴吧,你只要是新用户或者刚刚关注的贴吧,要是发帖,会马上出现验证码. 有效防止注册,以防,使用程序或机器人去无限制注册账号. 防刷票,网上有很多投

  • Django 登陆验证码和中间件的实现

    验证码 在用户注册.登陆页面为了防止暴力请求,可以加入验证码.如果验证码错误,则不需要继续处理,可以减轻服务器的压力 使用验证码也是一种有效防止 csrf 的方法 def verifycode(request): #引入绘图模块 from PIL import Image, ImageDraw, ImageFont #引入随机函数模块 import random #定义变量,用于画面的背景色.宽.高 bgcolor = (random.randrange(20, 100), random.ran

随机推荐