Python + Flask 实现简单的验证码系统


Posted in Python onOctober 01, 2019

一、写在前面

现在无论大大小小的网站,基本上都会使用验证码,登录的时候要验证,下载的时候要验证,而使用的验证码也从那些简简单单的字符图形验证码“进化”成了需要进行图文识别的验证码、需要拖动滑块的滑动验证码、甚至还有手机验证码。当你与之打交道的时候,有没有考虑过其背后的原理呢?当然了,对于那些复杂的验证码我们想要弄得一清二楚还是很难的,但是可以挑软柿子捏嘛--字符图形验证码,就这样,我决定用 Python + Flask 制作出一个简单的验证码系统来,话不多说,撸起袖子加油干!

Python + Flask 实现简单的验证码系统

二、基本思路

一个简单的验证码系统,要实现的目标包括能够不断刷新验证码和对用户输入的内容进行验证,若验证成功则进行后续操作,若失败则给出提示信息并要求重新输入。

但是没有大量验证码图片怎么办呢?正所谓“自己动手,丰衣足食”,Python 所具有的丰富的第三方库使得产生大量验证码图片这一需求变得甚是简单了,这里主要使用的模块是 pillow。

有了验证码图片之后,要做的就是将其显示在前端页面上,并且要能够更新验证码,这利用 Flask 可以很方便地实现。然后就是输入验证码和对输入的内容进行验证了,这里我是用 JS 实现验证的。

三、具体步骤

1.生成验证码图片

前面已经提过这一步主要使用的模块是 pillow,没有安装的话可以使用 pip install pillow 进行安装。

PIL:Python Image Library,是 Python 处理图片的标准库,不过 PIL 仅支持到 Python2.7,之后有人在其基础上创建了兼容的版本,名字就叫做 pillow。

新建一个 Flask 项目:CaptchaTest,然后创建一个 generate.py。要生成一个验证码图片,首先得创建一张图片,可以用 pillow 模块中的 Image.new() 实现。然后需要生成验证码文本并将其写入到前面生成的图片上,除此之外,我们还可以加入一些干扰元素增加识别的难度。下面是几张生成的验证码图片:

Python + Flask 实现简单的验证码系统

最终得到的生成验证码图片的代码如下:

 

from random import randint
 from PIL import Image, ImageDraw, ImageFont
 def get_random_color():
   # 随机颜色RGB
   return randint(120, 200), randint(120, 200), randint(120, 200) 
 def get_random_code():
   # 随机字符
   codes = [[chr(i) for i in range(48, 58)], [chr(i) for i in range(65, 91)], [chr(i) for i in range(97, 123)]]
   codes = codes[randint(0, 2)]
   return codes[randint(0, len(codes)-1)]
 def generate_captcha(width=140, height=60, length=4):
   # 生成验证码
   img = Image.new("RGB", (width, height), (250, 250, 250))
   draw = ImageDraw.Draw(img)
   font = ImageFont.truetype("static/font/font.ttf", size=36)
   # 验证码文本
   text = ""
   for i in range(length):
     c = get_random_code()
     text += c
     rand_len = randint(-5, 5)
     draw.text((width * 0.2 * (i+1) + rand_len, height * 0.2 + rand_len), c, font=font, fill=get_random_color())
   # 加入干扰线
   for i in range(3):
     x1 = randint(0, width)
     y1 = randint(0, height)
     x2 = randint(0, width)
     y2 = randint(0, height)
     draw.line((x1, y1, x2, y2), fill=get_random_color())
   # 加入干扰点
   for i in range(16):
     draw.point((randint(0, width), randint(0, height)), fill=get_random_color())
   # 保存图片
   img.save("static/captcha/" + text + ".jpg")
   return text + ".jpg"
 if __name__ == "__main__":
   for i in range(1000):
     generate_captcha()

2.显示验证码图片

在进行完上一步之后,我们已经得到了1000张验证码图片,都保存在 static 下的 captcha 文件夹下。那么现在的问题就是如何将验证码图片显示在页面上,要解决这个问题,首先要定义一个路由,用于随机选取验证码图片并返回路径。

在 Flask 中 route() 装饰器把一个函数绑定到 URL 上,不仅能配置静态 URL,而且能配置动态 URL,不过这里使用静态 URL 就行了。定义该路由的代码如下:

@app.route('/get_captcha', methods=['GET'])
 def get_captcha():
   img_list = os.listdir("static/captcha")
   img = img_list[random.randint(0, 1000)]
  return os.path.join("static/captcha", img)

其中 os.listdir() 用于列举文件夹下的内容,os.path.join() 用于返回图片路径。

3.刷新验证码图片

刷新验证码图片的功能可以通过使用 Ajax 来实现,主要过程是先向后端发送请求,请求成功之后会得到一个验证码图片路径, 然后再设置图片的 src 属性,达到刷新验证码的目的。在 Ajax 中的 URL 可以直接写静态 URL,还能使用 url_for 来反向解析获取对应的 URL,使用方法如下:

<script>
   function Change() {
     $.ajax({
       url: '{{ url_for('get_captcha') }}',
       async: true,
       type: "GET",
       success: function (data) {
         document.getElementById("captcha").src = data;
       }
     })
   }
 </script>

4.验证码内容验证

在输入验证码内容后,需要对输入的内容进行验证。因为前面生成验证码图片的时候直接用的图片内容来命名的,所以这里就可以用 JavaScript 来获取图片名称,再将输入框中的内容获取到,把两者进行比对,这一步还可以做一个忽略大小写,至于具体代码就不放了。

四、运行截图

首先是一张运行页面的截图,点击“看不清楚,换一张”可以刷新验证码,点击“确认”可以验证输入的内容是否正确:

Python + Flask 实现简单的验证码系统

 

当输入的内容正确的时候,给出一个验证成功的提示:

Python + Flask 实现简单的验证码系统

 

到这里为止,一个简单的验证码系统就做出来了,当然还有很多可以去完善的地方,比如使用更复杂的验证码,对验证次数进行限制等等。

 

完整代码已上传到 GitHub!

总结

以上所述是小编给大家介绍的Python + Flask 制作一个简单的验证码系统,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Python 相关文章推荐
Python中使用md5sum检查目录中相同文件代码分享
Feb 02 Python
Pthon批量处理将pdb文件生成dssp文件
Jun 21 Python
Python中序列的修改、散列与切片详解
Aug 27 Python
Python实现的多线程同步与互斥锁功能示例
Nov 30 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
Aug 05 Python
Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年
Apr 16 Python
基于python 将列表作为参数传入函数时的测试与理解
Jun 05 Python
Python 爬虫的原理
Jul 30 Python
基于Python模拟浏览器发送http请求
Nov 06 Python
详解Python中的进程和线程
Jun 23 Python
Python3的进程和线程你了解吗
Mar 16 Python
使用scrapy实现增量式爬取方式
Jun 21 Python
python 矢量数据转栅格数据代码实例
Sep 30 #Python
python多进程间通信代码实例
Sep 30 #Python
Python实现二叉树的最小深度的两种方法
Sep 30 #Python
python打开使用的方法
Sep 30 #Python
python 字典有序并写入json文件过程解析
Sep 30 #Python
python 下 CMake 安装配置 OPENCV 4.1.1的方法
Sep 30 #Python
Python3 翻转二叉树的实现
Sep 30 #Python
You might like
php使用socket post数据到其它web服务器的方法
2015/06/02 PHP
php通过baihui网API实现读取word文档并展示
2015/06/22 PHP
PHP共享内存用法实例分析
2016/02/12 PHP
jQuery替换字符串(实例代码)
2013/11/13 Javascript
node.js中的console.timeEnd方法使用说明
2014/12/09 Javascript
JavaScript显示当前文档最后修改日期的方法
2015/03/19 Javascript
浅谈Javascript线程及定时机制
2015/07/02 Javascript
弹出遮罩层后禁止滚动效果【实现代码】
2016/04/29 Javascript
使用Script元素发送JSONP请求的方法
2016/06/12 Javascript
D3.js实现直方图的方法详解
2016/09/25 Javascript
js基础之DOM中document对象的常用属性方法详解
2016/10/28 Javascript
实现一个完整的Node.js RESTful API的示例
2017/09/29 Javascript
Vue实现web分页组件详解
2017/11/28 Javascript
详解Vue单元测试case写法
2018/05/24 Javascript
bootstrap 弹出框modal添加垂直方向滚轴效果
2018/07/09 Javascript
jQuery实现点击旋转,再点击恢复初始状态动画效果示例
2018/12/11 jQuery
使用 vue 实现灭霸打响指英雄消失的效果附demo
2019/05/06 Javascript
node学习笔记之读写文件与开启第一个web服务器操作示例
2019/05/29 Javascript
微信小程序点击图片实现长按预览、保存、识别带参数二维码、转发等功能
2019/07/20 Javascript
[16:56]教你分分钟做大人:司夜刺客
2014/10/30 DOTA
[02:05:03]完美世界DOTA2联赛循环赛 LBZS VS Matador BO2 10.28
2020/10/28 DOTA
Python进行数据提取的方法总结
2016/08/22 Python
python中numpy包使用教程之数组和相关操作详解
2017/07/30 Python
详解pytorch 0.4.0迁移指南
2019/06/16 Python
导入tensorflow时报错:cannot import name 'abs'的解决
2019/10/10 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
2019/10/24 Python
keras实现theano和tensorflow训练的模型相互转换
2020/06/19 Python
Python 利用Entrez库筛选下载PubMed文献摘要的示例
2020/11/24 Python
Canvas实现贝赛尔曲线轨迹动画的示例代码
2019/04/25 HTML / CSS
北美三大旅游网站之一:Travelocity加拿大
2016/08/20 全球购物
英国第一的滑雪服装和装备零售商:Snow+Rock
2020/02/01 全球购物
安康杯竞赛活动总结
2014/05/05 职场文书
儿童生日会策划方案
2014/05/15 职场文书
应届毕业生自荐信
2014/05/28 职场文书
清明节文明祭祀倡议书
2015/04/28 职场文书
idea以任意顺序debug多线程程序的具体用法
2021/08/30 Java/Android