基于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 相关文章推荐
rhythmbox中文名乱码问题解决方法
Sep 06 Python
python中将函数赋值给变量时需要注意的一些问题
Aug 18 Python
python实现壁纸批量下载代码实例
Jan 25 Python
Python3中的json模块使用详解
May 05 Python
Python3模拟登录操作实例分析
Mar 12 Python
python 列表转为字典的两个小方法(小结)
Jun 28 Python
Django的性能优化实现解析
Jul 30 Python
Python 操作 ElasticSearch的完整代码
Aug 04 Python
python实现按首字母分类查找功能
Oct 31 Python
pytorch实现用CNN和LSTM对文本进行分类方式
Jan 08 Python
利用OpenCV中对图像数据进行64F和8U转换的方式
Jun 03 Python
简述python Scrapy框架
Aug 17 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 pcntl_fork和pcntl_fork 的用法
2009/04/13 PHP
[原创]PHP实现逐行删除文件右侧空格的方法
2015/12/25 PHP
Zend Framework分页类用法详解
2016/03/22 PHP
PHP使用PDO调用mssql存储过程的方法示例
2017/10/07 PHP
jquery 指南/入门基础
2007/11/30 Javascript
js实现在同一窗口浏览图片
2014/09/17 Javascript
jquery移动节点实例
2015/01/14 Javascript
Svg.js实例教程及使用手册详解(一)
2016/05/16 Javascript
BootStrap的alert提示框的关闭后再显示怎么解决
2016/05/17 Javascript
全面解析Bootstrap中scrollspy(滚动监听)的使用方法
2016/06/06 Javascript
12306 刷票脚本及稳固刷票脚本(防挂)
2017/01/04 Javascript
JS简单判断滚动条的滚动方向实现方法
2017/04/28 Javascript
详解在vue-cli中使用路由
2017/09/25 Javascript
基于vue中css预加载使用sass的配置方式详解
2018/03/13 Javascript
vue项目搭建以及全家桶的使用详细教程(小结)
2018/12/19 Javascript
详解vue为什么要求组件模板只能有一个根元素
2019/07/22 Javascript
koa2服务端使用jwt进行鉴权及路由权限分发的流程分析
2019/07/22 Javascript
Vue extend的基本用法(实例详解)
2019/12/09 Javascript
JS变量提升及函数提升实例解析
2020/09/03 Javascript
python实现装饰器、描述符
2018/02/28 Python
python 使用值来排序一个字典的方法
2018/11/16 Python
python tkinter组件使用详解
2019/09/16 Python
python 实现矩阵填充0的例子
2019/11/29 Python
tensorflow入门:TFRecordDataset变长数据的batch读取详解
2020/01/20 Python
pycharm 中mark directory as exclude的用法详解
2020/02/14 Python
python之MSE、MAE、RMSE的使用
2020/02/24 Python
Django封装交互接口代码
2020/07/12 Python
HTML5 Canvas——用路径描画线条实例介绍
2013/06/09 HTML / CSS
西尔斯百货官网:Sears
2016/09/06 全球购物
外贸业务员求职信范文
2013/12/12 职场文书
生产部岗位职责范文
2014/02/07 职场文书
机电一体化专业求职信
2014/07/22 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话全文
2014/10/25 职场文书
2014年信息技术工作总结
2014/12/16 职场文书
法制主题班会教案
2015/08/13 职场文书
Python基础知识之变量的详解
2021/04/14 Python