- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章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验证码功能的实现代码,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的! 。
最后此篇关于Python 中Django验证码功能的实现代码的文章就讲到这里了,如果你想了解更多关于Python 中Django验证码功能的实现代码的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我尝试理解[c代码 -> 汇编]代码 void node::Check( data & _data1, vector& _data2) { -> push ebp -> mov ebp,esp ->
我需要在当前表单(代码)的上下文中运行文本文件中的代码。其中一项要求是让代码创建新控件并将其添加到当前窗体。 例如,在Form1.cs中: using System.Windows.Forms; ..
我有此 C++ 代码并将其转换为 C# (.net Framework 4) 代码。有没有人给我一些关于 malloc、free 和 sprintf 方法的提示? int monate = ee; d
我的网络服务器代码有问题 #include #include #include #include #include #include #include int
给定以下 html 代码,将列表中的第三个元素(即“美丽”一词)以斜体显示的 CSS 代码是什么?当然,我可以给这个元素一个 id 或一个 class,但 html 代码必须保持不变。谢谢
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
我试图制作一个宏来避免重复代码和注释。 我试过这个: #define GrowOnPage(any Page, any Component) Component.Width := Page.Surfa
我正在尝试将我的旧 C++ 代码“翻译”成头条新闻所暗示的 C# 代码。问题是我是 C# 中的新手,并不是所有的东西都像 C++ 中那样。在 C++ 中这些解决方案运行良好,但在 C# 中只是不能。我
在 Windows 10 上工作,R 语言的格式化程序似乎没有在 Visual Studio Code 中完成它的工作。我试过R support for Visual Studio Code和 R-T
我正在处理一些报告(计数),我必须获取不同参数的计数。非常简单但乏味。 一个参数的示例查询: qCountsEmployee = ( "select count(*) from %s wher
最近几天我尝试从 d00m 调试网络错误。我开始用尽想法/线索,我希望其他 SO 用户拥有可能有用的宝贵经验。我希望能够提供所有相关信息,但我个人无法控制服务器环境。 整个事情始于用户注意到我们应用程
我有一个 app.js 文件,其中包含如下 dojo amd 模式代码: require(["dojo/dom", ..], function(dom){ dom.byId('someId').i
我对“-gencode”语句中的“code=sm_X”选项有点困惑。 一个例子:NVCC 编译器选项有什么作用 -gencode arch=compute_13,code=sm_13 嵌入库中? 只有
我为我的表格使用 X-editable 框架。 但是我有一些问题。 $(document).ready(function() { $('.access').editable({
我一直在通过本教程学习 flask/python http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-wo
我想将 Vim 和 EMACS 用于 CNC、G 代码和 M 代码。 Vim 或 EMACS 是否有任何语法或模式来处理这种类型的代码? 最佳答案 一些快速搜索使我找到了 this vim 和 thi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve this
这个问题在这里已经有了答案: Enabling markdown highlighting in Vim (5 个回答) 6年前关闭。 当我在 Vim 中编辑包含 Markdown 代码的 READM
我正在 Swift3 iOS 中开发视频应用程序。基本上我必须将视频 Assets 和音频与淡入淡出效果合并为一个并将其保存到 iPhone 画廊。为此,我使用以下方法: private func d
pipeline { agent any stages { stage('Build') { steps { e
我是一名优秀的程序员,十分优秀!