基于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实现人人网登录示例分享
Jan 19 Python
python的即时标记项目练习笔记
Sep 18 Python
Python实现查找系统盘中需要找的字符
Jul 14 Python
20招让你的Python飞起来!
Sep 27 Python
python3写爬取B站视频弹幕功能
Dec 22 Python
python虚拟环境迁移方法
Jan 03 Python
树莓派+摄像头实现对移动物体的检测
Jun 22 Python
利用python开发app实战的方法
Jul 09 Python
python3 深浅copy对比详解
Aug 12 Python
pytorch: Parameter 的数据结构实例
Dec 31 Python
Python3 集合set入门基础
Feb 10 Python
python 使用Tensorflow训练BP神经网络实现鸢尾花分类
May 12 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缩略图生成程式(需要GD库支持)
2007/03/06 PHP
php中array_unshift()修改数组key注意事项分析
2016/05/16 PHP
php 在字符串指定位置插入新字符的简单实现
2016/06/28 PHP
关于laravel后台模板laravel-admin select框的使用详解
2019/10/03 PHP
基于jquery的气泡提示效果
2010/05/31 Javascript
关于jquery append() html时的小问题的解决方法
2010/12/16 Javascript
javascript通过className来获取元素的简单示例代码
2014/01/10 Javascript
利用jQuery实现CheckBox全选/全不选/反选的简单代码
2016/05/31 Javascript
JavaScript比较当前时间是否在指定时间段内的方法
2016/08/02 Javascript
原生js实现jquery函数animate()动画效果的简单实例
2016/08/21 Javascript
js中创建对象的几种方式
2017/02/05 Javascript
Vue.js实战之通过监听滚动事件实现动态锚点
2017/04/04 Javascript
JS排序之冒泡排序详解
2017/04/08 Javascript
Angular2学习教程之组件中的DOM操作详解
2017/05/28 Javascript
Vue中使用的EventBus有生命周期
2018/07/12 Javascript
解决angularJS中input标签的ng-change事件无效问题
2018/09/13 Javascript
VUE+node(express)实现前后端分离
2019/10/13 Javascript
可拖拽组件slider.js使用方法详解
2020/12/04 Javascript
[06:30]DOTA2英雄梦之声_第15期_死亡先知
2014/06/21 DOTA
使用python BeautifulSoup库抓取58手机维修信息
2013/11/21 Python
Python并行分布式框架Celery详解
2018/10/15 Python
python文件拆分与重组实例
2018/12/10 Python
Python 2种方法求某个范围内的所有素数(质数)
2020/01/31 Python
python实现堆排序的实例讲解
2020/02/21 Python
3分钟看懂Python后端必须知道的Django的信号机制
2020/07/26 Python
Python在字符串中处理html和xml的方法
2020/07/31 Python
CSS3实现红包抖动效果
2020/12/23 HTML / CSS
彪马美国官网:PUMA美国
2017/03/09 全球购物
Chain Reaction Cycles俄罗斯:世界上最大的在线自行车商店
2019/08/27 全球购物
实习自我评价怎么写
2013/12/02 职场文书
护士长2014年度工作总结
2014/11/11 职场文书
2014年仓库保管员工作总结
2014/12/03 职场文书
北京故宫导游词
2015/01/31 职场文书
如何用JavaScript实现一个数组惰性求值库
2021/05/05 Javascript
Python趣味挑战之给幼儿园弟弟生成1000道算术题
2021/05/28 Python
Python线程池与GIL全局锁实现抽奖小案例
2022/04/13 Python