基于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使用os模块和fileinput模块来操作文件目录
Jan 19 Python
Django与JS交互的示例代码
Aug 23 Python
对python pandas 画移动平均线的方法详解
Nov 28 Python
Python开启线程,在函数中开线程的实例
Feb 22 Python
python实现websocket的客户端压力测试
Jun 25 Python
详解Python用三种方式统计词频的方法
Jul 29 Python
python正则爬取某段子网站前20页段子(request库)过程解析
Aug 10 Python
Python爬虫 批量爬取下载抖音视频代码实例
Aug 16 Python
Python使用selenium + headless chrome获取网页内容的方法示例
Oct 16 Python
django xadmin 管理器常用显示设置方式
Mar 11 Python
浅谈Python中文件夹和python package包的区别
Jun 01 Python
python判断一个变量是否已经设置的方法
Aug 13 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
《APMServ 5.1.2》使用图解
2006/10/23 PHP
php面向对象全攻略 (十) final static const关键字的使用
2009/09/30 PHP
PHPUnit PHP测试框架安装方法
2011/03/23 PHP
Laravel最佳分割路由文件(routes.php)的方式
2016/08/04 PHP
在laravel中实现将查询的对象转换为多维数组的函数
2019/10/21 PHP
理解 JavaScript 预解析
2009/10/25 Javascript
jquery $.each 和for怎么跳出循环终止本次循环
2013/09/27 Javascript
老生常谈JavaScript 函数表达式
2016/09/01 Javascript
flag和jq on 的绑定多个对象和方法(必看)
2017/02/27 Javascript
详解如何使用 vue-cli 开发多页应用
2017/12/16 Javascript
axios全局请求参数设置,请求及返回拦截器的方法
2018/03/05 Javascript
JavaScript中创建原子的方法总结
2018/08/26 Javascript
vue v-for 使用问题整理小结
2019/08/04 Javascript
Postman动态获取返回值过程详解
2020/06/30 Javascript
Nodejs + sequelize 实现增删改查操作
2020/11/07 NodeJs
[03:55]DOTA2完美大师赛选手传记——LFY.MONET
2017/11/18 DOTA
Python操作Mysql实例代码教程在线版(查询手册)
2013/02/18 Python
linux系统使用python监测系统负载脚本分享
2014/01/15 Python
scrapy爬虫实例分享
2017/12/28 Python
python2.7无法使用pip的解决方法(安装easy_install)
2018/04/03 Python
python实现自动网页截图并裁剪图片
2018/07/30 Python
python获取中文字符串长度的方法
2018/11/14 Python
Python给图像添加噪声具体操作
2019/03/03 Python
Python3网络爬虫中的requests高级用法详解
2019/06/18 Python
利用Python实现kNN算法的代码
2019/08/16 Python
使用Django实现把两个模型类的数据聚合在一起
2020/03/28 Python
简单了解python shutil模块原理及使用方法
2020/04/28 Python
全球最大的游戏市场:G2A
2018/07/05 全球购物
业务助理岗位职责
2013/11/18 职场文书
元旦联欢会主持词
2014/03/26 职场文书
春节联欢会策划方案
2014/05/16 职场文书
销售团队获奖感言
2014/08/14 职场文书
学校安全工作汇报材料
2014/08/16 职场文书
幼儿园小班家长评语
2014/12/30 职场文书
节约用电倡议书
2015/04/28 职场文书
2015小学教育教学工作总结
2015/07/21 职场文书