基于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中使用mongoengine操作MongoDB教程
Apr 24 Python
Django 添加静态文件的两种实现方法(必看篇)
Jul 14 Python
Python 操作文件的基本方法总结
Aug 10 Python
python贪婪匹配以及多行匹配的实例讲解
Apr 19 Python
详解Django的CSRF认证实现
Oct 09 Python
pandas 如何分割字符的实现方法
Jul 29 Python
Python使用Pandas对csv文件进行数据处理的方法
Aug 01 Python
pycharm 批量修改变量名称的方法
Aug 01 Python
在Keras中利用np.random.shuffle()打乱数据集实例
Jun 15 Python
Django CBV模型源码运行流程详解
Aug 17 Python
一文带你了解Python 四种常见基础爬虫方法介绍
Dec 04 Python
将不规则的Python多维数组拉平到一维的方法实现
Jan 11 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
Syphon 使用方法
2021/03/03 冲泡冲煮
解析php中eclipse 用空格替换 tab键
2013/06/24 PHP
2个Codeigniter文件批量上传控制器写法例子
2014/07/25 PHP
PHP实现仿百度文库,豆丁在线文档效果(word,excel,ppt转flash)
2016/03/10 PHP
Yii2汉字转拼音类的实例代码
2017/04/18 PHP
PHP registerXPathNamespace()函数讲解
2019/02/03 PHP
PHP读取XML文件的方法实例总结【DOMDocument及simplexml方法】
2019/09/10 PHP
SUN的《AJAX与J2EE》全文译了
2007/02/23 Javascript
javascript中call和apply方法浅谈
2013/09/27 Javascript
jquery定时滑出可最小化的底部提示层特效代码
2013/10/02 Javascript
JS事件在IE与FF中的区别详细解析
2013/11/20 Javascript
调用HttpHanlder的几种返回方式小结
2013/12/20 Javascript
javascript折半查找详解
2015/01/26 Javascript
JS实现浏览器状态栏显示时间的方法
2015/10/27 Javascript
DOM操作和jQuery实现选项移动操作的简单实例
2016/06/07 Javascript
BootStrap学习系列之Bootstrap Typeahead 组件实现百度下拉效果(续)
2016/07/07 Javascript
AngularJS中isolate scope的用法分析
2016/11/22 Javascript
jquery 判断div show的状态实例
2016/12/03 Javascript
Vue.js实现的计算器功能完整示例
2018/07/11 Javascript
详解vue路由篇(动态路由、路由嵌套)
2019/01/27 Javascript
详解Python3中ceil()函数用法
2019/02/19 Python
python内存监控工具memory_profiler和guppy的用法详解
2019/07/29 Python
python应用文件读取与登录注册功能
2019/09/23 Python
Pytorch保存模型用于测试和用于继续训练的区别详解
2020/01/10 Python
利用Python将图片中扭曲矩形的复原
2020/09/07 Python
Html5移动端获奖无缝滚动动画实现示例
2018/06/25 HTML / CSS
Linux如何命名文件--使用文件名时应注意
2012/01/22 面试题
小学生美德少年事迹
2014/02/02 职场文书
刚毕业大学生自荐信范文
2014/02/20 职场文书
微笑服务演讲稿
2014/05/13 职场文书
工程承包协议书范本
2014/09/29 职场文书
公司离职证明标准范本
2014/10/05 职场文书
婚礼长辈答谢词
2015/09/29 职场文书
情况说明书格式及范文
2019/06/24 职场文书
创业计划书之珠宝饰品
2019/08/26 职场文书
话题作文之成长
2019/12/09 职场文书