基于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进程通信之匿名管道实例讲解
Apr 11 Python
在Apache服务器上同时运行多个Django程序的方法
Jul 22 Python
python编程嵌套函数实例代码
Feb 11 Python
python文本数据相似度的度量
Mar 12 Python
python实现pdf转换成word/txt纯文本文件
Jun 07 Python
Python 获取ftp服务器文件时间的方法
Jul 02 Python
python GUI库图形界面开发之PyQt5多行文本框控件QTextEdit详细使用方法实例
Feb 28 Python
如何在Django中使用聚合的实现示例
Mar 23 Python
基于TensorFlow的CNN实现Mnist手写数字识别
Jun 17 Python
Numpy(Pandas)删除全为零的列的方法
Sep 11 Python
2020版Python学习路线图(附学习资料)
Sep 15 Python
python爬取豆瓣电影排行榜(requests)的示例代码
Feb 18 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
根德YB400的电路分析
2021/03/02 无线电
PHP连接sql server 2005环境配置及问题解决
2014/08/08 PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
2015/04/21 PHP
基于thinkPHP实现的微信自定义分享功能示例
2016/09/23 PHP
thinkPHP中验证码的简单实现方法
2016/12/05 PHP
php及codeigniter使用session-cookie的方法(详解)
2017/04/06 PHP
Jquery拖拽并简单保存的实现代码
2010/11/28 Javascript
浅谈JavaScript函数参数的可修改性问题
2013/12/05 Javascript
jQuery实现给页面换肤的方法
2015/05/30 Javascript
JQUERY实现网页右下角固定位置展开关闭特效的方法
2015/07/27 Javascript
JavaScript学习小结之使用canvas画“哆啦A梦”时钟
2016/07/24 Javascript
用NodeJS实现批量查询地理位置的经纬度接口
2016/08/16 NodeJs
微信小程序加载更多 点击查看更多
2016/11/29 Javascript
原生js实现倒计时功能(多种格式调用)
2017/01/12 Javascript
JS实现颜色动态淡化效果
2017/03/06 Javascript
简单的JS控制button颜色随点击更改的实现方法
2017/04/17 Javascript
在Vue.js中使用Mixins的方法
2017/09/12 Javascript
Vue+jquery实现表格指定列的文字收缩的示例代码
2018/01/09 jQuery
Vue中keep-alive组件作用详解
2020/02/04 Javascript
Vue循环中多个input绑定指定v-model实例
2020/08/31 Javascript
python 快速排序代码
2009/11/23 Python
python使用PyV8执行javascript代码示例分享
2013/12/04 Python
python使用xlrd实现检索excel中某列含有指定字符串记录的方法
2015/05/09 Python
Python 使用 attrs 和 cattrs 实现面向对象编程的实践
2019/06/12 Python
PyCharm License Activation激活码失效问题的解决方法(图文详解)
2020/03/12 Python
keras做CNN的训练误差loss的下降操作
2020/06/22 Python
使用Python快速打开一个百万行级别的超大Excel文件的方法
2021/03/02 Python
CSS3制作漂亮的照片墙的实现代码
2016/06/08 HTML / CSS
美国最大的存储市场:SpareFoot
2018/07/23 全球购物
英国电子产品购物网站:TobyDeals
2018/07/30 全球购物
美国网上书店:Barnes & Noble
2018/08/15 全球购物
汽车运用工程系毕业生自荐信
2013/12/27 职场文书
文化产业实施方案
2014/06/07 职场文书
委托书格式范文
2015/01/28 职场文书
付款证明格式范文
2015/06/19 职场文书
apache基于端口创建虚拟主机的示例
2021/04/24 Servers