基于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 相关文章推荐
c++生成dll使用python调用dll的方法
Jan 20 Python
Python实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器
Jun 04 Python
Python最基本的数据类型以及对元组的介绍
Apr 14 Python
Python3使用requests发闪存的方法
May 11 Python
解决项目pycharm能运行,在终端却无法运行的问题
Jan 19 Python
Python利用sqlacodegen自动生成ORM实体类示例
Jun 04 Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
Jul 01 Python
python NumPy ndarray二维数组 按照行列求平均实例
Nov 26 Python
Python基础类继承重写实现原理解析
Apr 03 Python
keras实现VGG16方式(预测一张图片)
Jul 07 Python
基于Python实现体育彩票选号器功能代码实例
Sep 16 Python
深度学习详解之初试机器学习
Apr 14 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时间不正确的解决方法
2008/04/09 PHP
PHP封装CURL扩展类实例
2015/07/28 PHP
PHP图像裁剪缩略裁切类源码及使用方法
2016/01/07 PHP
Track Image Loading效果代码分析
2007/08/13 Javascript
JavaScript Date对象使用总结
2009/05/14 Javascript
js 匿名调用实现代码
2009/06/19 Javascript
jquery fancybox ie6不显示关闭按钮的解决办法
2013/12/25 Javascript
Javascript 遍历页面text控件详解
2014/01/06 Javascript
JQuery中使用Ajax赋值给全局变量异常的解决方法
2014/01/10 Javascript
jquery控制背景音乐开关与自动播放提示音的方法
2015/02/06 Javascript
jQuery实现切换页面过渡动画效果
2015/10/29 Javascript
JavaScript禁止复制与粘贴的实现代码
2016/05/16 Javascript
nodejs获取微信小程序带参数二维码实现代码
2017/04/12 NodeJs
easyui combogrid实现本地模糊搜索过滤多列
2017/05/13 Javascript
vue中的自定义分页插件组件的示例
2018/08/18 Javascript
linux下python中文乱码解决方案详解
2019/08/28 Python
python opencv调用笔记本摄像头
2019/08/28 Python
python字符串判断密码强弱
2020/03/18 Python
pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)
2020/04/15 Python
python使用建议技巧分享(三)
2020/08/18 Python
WoolOvers澳洲官方网站:英国针织服装公司
2018/05/13 全球购物
帕克纽约:PARKER NY
2018/12/09 全球购物
WEB控件可以激发服务端事件,请谈谈服务端事件是怎么发生并解释其原理?自动传回是什么?为什么要使用自动传回?
2012/02/21 面试题
巧克力蛋糕店创业计划书
2014/01/14 职场文书
《长城》教学反思
2014/02/14 职场文书
年终奖发放方案
2014/06/02 职场文书
法学专业毕业生自荐信
2014/06/11 职场文书
锦旗标语大全
2014/06/23 职场文书
社区爱国卫生月活动总结
2014/06/30 职场文书
暑假安全教育广播稿
2014/09/10 职场文书
2014学习优秀共产党员先进事迹材料思想汇报
2014/09/14 职场文书
金榜题名主持词
2015/07/02 职场文书
2019辞职报告范本3篇!
2019/07/23 职场文书
Redis主从配置和底层实现原理解析(实战记录)
2021/06/30 Redis
Go 中的空白标识符下划线
2022/03/25 Golang
vue css 相对路径导入问题级踩坑记录
2022/06/05 Vue.js