基于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 相关文章推荐
MySQLdb ImportError: libmysqlclient.so.18解决方法
Aug 21 Python
深入理解Python中的元类(metaclass)
Feb 14 Python
Python自定义类的数组排序实现代码
Aug 28 Python
python+selenium实现163邮箱自动登陆的方法
Dec 31 Python
Python实现邮件的批量发送的示例代码
Jan 23 Python
Python中作用域的深入讲解
Dec 10 Python
python编写简单端口扫描器
Sep 04 Python
pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解
Jan 02 Python
Python中断多重循环的几种方式详解
Feb 10 Python
Django ORM 查询表中某列字段值的方法
Apr 30 Python
在pycharm中关掉ipython console/PyDev操作
Jun 09 Python
python Cartopy的基础使用详解
Nov 01 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生成WAP页面
2006/10/09 PHP
php中memcache 基本操作实例
2015/05/17 PHP
Zend Framework开发入门经典教程
2016/03/23 PHP
IE6/7/8中Option元素未设value时Select将获取空字符串
2011/04/07 Javascript
使用jQuery内容过滤选择器选择元素实例讲解
2013/04/18 Javascript
分享一款基于jQuery的视频播放插件
2014/10/09 Javascript
原生js和jQuery写的网页选项卡特效对比
2015/04/27 Javascript
jQuery结合AJAX之在页面滚动时从服务器加载数据
2015/06/30 Javascript
JavaScript数组去重的五种方法
2015/11/05 Javascript
JavaScript表单验证开发
2016/11/23 Javascript
Vue2.0父子组件传递函数的教程详解
2017/10/16 Javascript
js原生方法被覆盖,从新赋值原生的方法
2018/01/02 Javascript
基于jQuery的时间戳与日期间的转化
2019/06/21 jQuery
JavaScript WeakMap使用详解
2021/02/05 Javascript
Python挑选文件夹里宽大于300图片的方法
2015/03/05 Python
学习python之编写简单简单连接数据库并执行查询操作
2016/02/27 Python
Python函数的周期性执行实现方法
2016/08/13 Python
python验证码识别的实例详解
2016/09/09 Python
numpy中实现ndarray数组返回符合特定条件的索引方法
2018/04/17 Python
通过cmd进入python的实例操作
2019/06/26 Python
CSS3实现网站商品展示效果图
2020/01/18 HTML / CSS
HTML5 Canvas中使用路径描画二阶、三阶贝塞尔曲线
2015/01/01 HTML / CSS
I.T中国官网:精选时尚设计师单品网购平台
2018/03/26 全球购物
美国最大的半成品净菜电商:Blue Apron(蓝围裙)
2018/04/27 全球购物
大学生最常用的自我评价
2013/12/07 职场文书
给物业的表扬信
2014/01/21 职场文书
会计专业应届生自荐信
2014/02/07 职场文书
少年闰土教学反思
2014/02/22 职场文书
机动车登记业务委托书
2014/10/08 职场文书
2014年社区宣传工作总结
2014/12/02 职场文书
仓管员岗位职责范本
2015/04/01 职场文书
2016三严三实专题教育活动心得体会
2016/01/06 职场文书
年终工作总结范文
2019/06/20 职场文书
Html5新增了哪些功能
2021/04/16 HTML / CSS
Java实现斗地主之洗牌发牌
2021/06/14 Java/Android
python使用BeautifulSoup 解析HTML
2022/04/24 Python