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


Posted in Python onOctober 23, 2017

验证码

在用户注册、登录页面,为了防止暴力请求,可以加入验证码功能,如果验证码错误,则不需要继续处理,可以减轻一些服务器的压力

使用验证码也是一种有效的防止crsf的方法

验证码效果如下图:

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

验证码视图

新建viewsUtil.py,定义函数verifycode

此段代码用到了PIL中的Image、ImageDraw、ImageFont模块,需要先安装Pillow(3.4.1)包,

详细文档参考 http://pillow.readthedocs.io/en/3.4.x/

Image表示画布对象

ImageDraw表示画笔对象

ImageFont表示字体对象,ubuntu的字体路径为“/usr/share/fonts/truetype/freefont”

代码如下:

from django.http import HttpResponse
def verifycode(request):
 #引入绘图模块
 from PIL import Image, ImageDraw, ImageFont
 #引入随机函数模块
 import random
 #定义变量,用于画面的背景色、宽、高
 bgcolor = (random.randrange(20, 100), random.randrange(
  20, 100), 255)
 width = 100
 height = 25
 #创建画面对象
 im = Image.new('RGB', (width, height), bgcolor)
 #创建画笔对象
 draw = ImageDraw.Draw(im)
 #调用画笔的point()函数绘制噪点
 for i in range(0, 100):
  xy = (random.randrange(0, width), random.randrange(0, height))
  fill = (random.randrange(0, 255), 255, random.randrange(0, 255))
  draw.point(xy, fill=fill)
 #定义验证码的备选值
 str1 = 'ABCD123EFGHIJK456LMNOPQRS789TUVWXYZ0'
 #随机选取4个值作为验证码
 rand_str = ''
 for i in range(0, 4):
  rand_str += str1[random.randrange(0, len(str1))]
 #构造字体对象
 font = ImageFont.truetype('FreeMono.ttf', 23)
 #构造字体颜色
 fontcolor = (255, random.randrange(0, 255), random.randrange(0, 255))
 #绘制4个字
 draw.text((5, 2), rand_str[0], font=font, fill=fontcolor)
 draw.text((25, 2), rand_str[1], font=font, fill=fontcolor)
 draw.text((50, 2), rand_str[2], font=font, fill=fontcolor)
 draw.text((75, 2), rand_str[3], font=font, fill=fontcolor)
 #释放画笔
 del draw
 #存入session,用于做进一步验证
 request.session['verifycode'] = rand_str
 #内存文件操作
 import io
 buf = io.StringIO()
 #将图片保存在内存中,文件类型为png
 im.save(buf, 'png')
 #将内存中的图片数据返回给客户端,MIME类型为图片png
 return HttpResponse(buf.getvalue(), 'image/png')

配置url

在urls.py中定义请求验证码视图的url

from . import viewsUtil

urlpatterns = [
 url(r'^verifycode/$', viewsUtil.verifycode),
]

显示验证码

•在模板中使用img标签,src指向验证码视图

<img id='verifycode' src="/verifycode/" alt="CheckCode"/>

•启动服务器,查看显示成功

•扩展:点击“看不清,换一个”时,可以换一个新的验证码

<script type="text/javascript" src="/static/jquery-1.12.4.min.js"></script>
<script type="text/javascript">
  $(function(){
    $('#verifycodeChange').css('cursor','pointer').click(function() {
      $('#verifycode').attr('src',$('#verifycode').attr('src')+1)
    });
  });
</script>
<img id='verifycode' src="/verifycode/?1" alt="CheckCode"/>
<span id='verifycodeChange'>看不清,换一个</span>

•为了能够实现提交功能,需要增加form和input标签

<form method='post' action='/verifycodeValid/'>
  <input type="text" name="vc">
  <img id='verifycode' src="/verifycode/?1" alt="CheckCode"/>
<span id='verifycodeChange'>看不清,换一个</span>
<br>
<input type="submit" value="提交">
</form>

验证

•接收请求的信息,与session中的内容对比

from django.http import HttpResponse

def verifycodeValid(request):
  vc = request.POST['vc']
  if vc.upper() == request.session['verifycode']:
    return HttpResponse('ok')
  else:
    return HttpResponse('no')

•配置验证处理的url

urlpatterns = [
  url(r'^verifycodeValid/$', views.verifycodeValid),
]

以上这篇基于Django的python验证码(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python去掉字符串中空格的方法
Mar 11 Python
python正则表达式match和search用法实例
Mar 26 Python
Python中subprocess的简单使用示例
Jul 28 Python
Python正则表达式使用经典实例
Jun 21 Python
Python实现的括号匹配判断功能示例
Aug 25 Python
Python面向对象之继承和组合用法实例分析
Aug 27 Python
Python打开文件,将list、numpy数组内容写入txt文件中的方法
Oct 26 Python
Ubuntu下升级 python3.7.1流程备忘(推荐)
Dec 10 Python
如何在python开发工具PyCharm中搭建QtPy环境(教程详解)
Feb 04 Python
python mysql自增字段AUTO_INCREMENT值的修改方式
May 18 Python
Matplotlib配色之Colormap详解
Jan 05 Python
python 图像增强算法实现详解
Jan 24 Python
itchat接口使用示例
Oct 23 #Python
python实现微信接口(itchat)详细介绍
Oct 23 #Python
python爬虫_微信公众号推送信息爬取的实例
Oct 23 #Python
Python 模拟员工信息数据库操作的实例
Oct 23 #Python
Scrapy爬虫实例讲解_校花网
Oct 23 #Python
Python学习笔记之if语句的使用示例
Oct 23 #Python
Django实现快速分页的方法实例
Oct 22 #Python
You might like
PHP 命令行工具 shell_exec, exec, passthru, system详细使用介绍
2011/09/11 PHP
php 记录进行累加并显示总时长为秒的结果
2011/11/04 PHP
基于php权限分配的实现代码
2013/04/28 PHP
PHP高级编程实例:编写守护进程
2014/09/02 PHP
使用PHP生成图片的缩略图的方法
2015/08/18 PHP
JavaScript 自动完成脚本整理(33个)
2009/10/20 Javascript
jquery nth-child()选择器的简单应用
2010/07/10 Javascript
让你的CSS像Jquery一样做筛选的实现方法
2011/07/10 Javascript
JS写的贪吃蛇游戏(个人练习)
2013/07/08 Javascript
jQuery调用RESTful WCF示例代码(GET方法/POST方法)
2014/01/26 Javascript
NodeJS中Buffer模块详解
2015/01/07 NodeJs
Javascript实现可旋转的圆圈实例代码
2015/08/04 Javascript
Javascript 高性能之递归,迭代,查表法详解及实例
2017/01/08 Javascript
JS原型与原型链的深入理解
2017/02/15 Javascript
nodejs入门教程三:调用内部和外部方法示例
2017/04/24 NodeJs
js实现上传并压缩图片效果
2018/01/10 Javascript
React Router v4 入坑指南(小结)
2018/04/08 Javascript
JS实现图片转换成base64的各种应用场景实例分析
2018/06/22 Javascript
element-ui 设置菜单栏展开的方法
2018/08/22 Javascript
轻松解决JavaScript定时器越走越快的问题
2019/05/13 Javascript
微信小程序 高德地图路线规划实现过程详解
2019/08/05 Javascript
Vue2.0 实现页面缓存和不缓存的方式
2019/11/12 Javascript
优化Vue中date format的性能详解
2020/01/13 Javascript
深入解读VUE中的异步渲染的实现
2020/06/19 Javascript
微信小程序视频弹幕发送功能的实现
2020/12/28 Javascript
Python实现好友全头像的拼接实例(推荐)
2017/06/24 Python
Django使用Celery异步任务队列的使用
2018/03/13 Python
对Python 两大环境管理神器 pyenv 和 virtualenv详解
2018/12/31 Python
Python APScheduler执行使用方法详解
2020/12/10 Python
墨西哥网上超市:Superama
2018/07/10 全球购物
澳大利亚排名第一的儿童在线玩具商店:Toy Galaxy
2018/10/06 全球购物
幸福家庭事迹材料
2014/02/03 职场文书
工作时间上网检讨书
2014/02/03 职场文书
委托书格式要求
2015/01/28 职场文书
校运会加油稿大全
2015/07/22 职场文书
Mysql多层子查询示例代码(收藏夹案例)
2022/03/31 MySQL