基于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 相关文章推荐
Python3 加密(hashlib和hmac)模块的实现
Nov 23 Python
python实现校园网自动登录的示例讲解
Apr 22 Python
Python中常用的内置方法
Jan 28 Python
python中aioysql(异步操作MySQL)的方法
Apr 11 Python
python读出当前时间精度到秒的代码
Jul 05 Python
django将网络中的图片,保存成model中的ImageField的实例
Aug 07 Python
python 解决flask uwsgi 获取不到全局变量的问题
Dec 22 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
Feb 23 Python
Pytorch十九种损失函数的使用详解
Apr 29 Python
Python生成器next方法和send方法区别详解
May 30 Python
python爬虫用mongodb的理由
Jul 28 Python
Python grpc超时机制代码示例
Sep 14 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
深入密码加salt原理的分析
2013/06/06 PHP
php实现转换ubb代码的方法
2015/06/18 PHP
php实现登陆模块功能示例
2016/10/20 PHP
php求数组全排列,元素所有组合的方法总结
2017/03/14 PHP
PDO::prepare讲解
2019/01/29 PHP
jQuery验证Checkbox是否选中的代码 推荐
2011/09/04 Javascript
如何让页面在打开时自动刷新一次让图片全部显示
2012/12/17 Javascript
jquery属性过滤选择器使用示例
2013/06/18 Javascript
简述AngularJS相关的一些编程思想
2015/06/23 Javascript
jQuery实现的经典竖向伸缩菜单效果代码
2015/09/24 Javascript
微信开发之调起摄像头、本地展示图片、上传下载图片实例
2016/12/08 Javascript
selenium 与 chrome 进行qq登录并发邮件操作实例详解
2017/04/06 Javascript
JS中Swiper的使用和轮播图效果
2017/08/11 Javascript
9种改善AngularJS性能的方法
2017/11/28 Javascript
使用react render props实现倒计时的示例代码
2018/12/06 Javascript
精读《Vue3.0 Function API》
2020/05/20 Javascript
如何使用 JavaScript 操作浏览器历史记录 API
2020/11/24 Javascript
vue+vant 上传图片需要注意的地方
2021/01/03 Vue.js
[45:38]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第一局
2016/03/02 DOTA
pygame加载中文名mp3文件出现error
2017/03/31 Python
解决Python print 输出文本显示 gbk 编码错误问题
2018/07/13 Python
Pycharm2017版本设置启动时默认自动打开项目的方法
2018/10/29 Python
python Tkinter版学生管理系统
2019/02/20 Python
Python中的Socket 与 ScoketServer 通信及遇到问题解决方法
2019/04/01 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
2019/06/11 Python
基于Python的图像阈值化分割(迭代法)
2020/11/20 Python
枚举和一组预处理的#define有什么不同
2016/09/21 面试题
音乐学院硕士生的自我评价分享
2013/11/01 职场文书
甲方资料员岗位职责
2013/12/13 职场文书
毕业生自荐信格式
2014/03/07 职场文书
五水共治捐款倡议书
2014/05/14 职场文书
美食节目策划方案
2014/05/31 职场文书
常务副总经理任命书
2014/06/05 职场文书
Redis 哨兵集群的实现
2021/06/18 Redis
浅谈redis整数集为什么不能降级
2021/07/25 Redis
JPA 通过Specification如何实现复杂查询
2021/11/23 Java/Android