基于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自动格式化json文件的方法
Mar 11 Python
详解Python中最难理解的点-装饰器
Apr 03 Python
详解python string类型 bytes类型 bytearray类型
Dec 16 Python
python模块smtplib学习
May 22 Python
Python3 Post登录并且保存cookie登录其他页面的方法
Dec 28 Python
python 定时任务去检测服务器端口是否通的实例
Jan 26 Python
win8.1安装Python 2.7版环境图文详解
Jul 01 Python
关于pytorch多GPU训练实例与性能对比分析
Aug 19 Python
python多线程分块读取文件
Aug 29 Python
tensorflow 重置/清除计算图的实现
Jan 19 Python
python通过cython加密代码
Dec 11 Python
使用numpngw和matplotlib生成png动画的示例代码
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统计二维数组元素个数的方法
2013/11/12 PHP
如何使用php实现评委评分器
2015/07/31 PHP
HTTP状态代码以及定义(解释)
2007/02/02 Javascript
javascript实现的动态添加表单元素input,button等(appendChild)
2007/11/24 Javascript
深入认识javascript中的eval函数
2009/11/02 Javascript
利用location.hash实现跨域iframe自适应
2010/05/04 Javascript
js判断一个元素是否为另一个元素的子元素的代码
2012/03/21 Javascript
js绑定事件this指向发生改变的问题解决方法
2013/04/23 Javascript
PHP捕捉异常中断的方法
2016/10/24 Javascript
深入理解jQuery()方法的构建原理
2016/12/05 Javascript
Bootstrap select下拉联动(jQuery cxselect)
2017/01/04 Javascript
微信小程序 在线支付功能的实现
2017/03/14 Javascript
jquery平滑滚动到顶部插件使用详解
2017/05/08 jQuery
详解Vue组件之间的数据通信实例
2017/06/17 Javascript
vue :src 文件路径错误问题的解决方法
2018/05/15 Javascript
JS获取指定月份的天数两种实现方法
2018/06/22 Javascript
angularJs中orderBy筛选以及filter过滤数据的方法
2018/09/30 Javascript
详解单页面路由工程使用微信分享及二次分享解决方案
2019/02/22 Javascript
微信小程序如何实现全局重新加载
2019/06/05 Javascript
解决layer.open弹出框不能获取input框的值为空的问题
2019/09/10 Javascript
vue项目引入ts步骤(小结)
2019/10/31 Javascript
用VsCode编辑TypeScript的实现方法
2020/05/07 Javascript
vue 公共列表选择组件,引用Vant-UI的样式方式
2020/11/02 Javascript
Python模拟登入的N种方式(建议收藏)
2020/05/31 Python
解决margin 外边距合并问题
2019/07/03 HTML / CSS
HTML5全屏(Fullscreen)API详细介绍
2015/04/24 HTML / CSS
Ray-Ban雷朋瑞典官方网站:全球领先的太阳眼镜品牌
2019/08/22 全球购物
介绍一下Ruby的多线程处理
2013/02/01 面试题
物业管理公司实习生自我鉴定
2013/09/19 职场文书
初中三年学生的学习自我评价
2013/11/13 职场文书
行政助理的岗位职责
2014/02/18 职场文书
幼儿园老师寄语
2014/04/03 职场文书
实习生个人总结范文
2015/02/28 职场文书
优秀教师工作总结2015
2015/07/22 职场文书
Ajax常用封装库——Axios的使用
2021/05/08 Javascript
HTTP中的Content-type详解
2022/01/18 HTML / CSS