基于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实现通过shelve修改对象实例
Sep 26 Python
举例详解Python中循环语句的嵌套使用
May 14 Python
Python运算符重载详解及实例代码
Mar 07 Python
Python实现随机生成有效手机号码及身份证功能示例
Jun 05 Python
python排序函数sort()与sorted()的区别
Sep 18 Python
python mac下安装虚拟环境的图文教程
Apr 12 Python
Python下应用opencv 实现人脸检测功能
Oct 24 Python
PyTorch 普通卷积和空洞卷积实例
Jan 07 Python
在tensorflow中实现屏蔽输出的log信息
Feb 04 Python
关于Python解包知识点总结
May 05 Python
解决django框架model中外键不落实到数据库问题
May 20 Python
python中validators库的使用方法详解
Sep 23 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数组排序函数合集 以及它们之间的联系分析
2013/06/27 PHP
根据中文裁减字符串函数的php代码
2013/12/03 PHP
一个简单的php路由类
2016/05/29 PHP
PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)
2016/11/15 PHP
js用图作提交按钮或超连接
2008/03/26 Javascript
Javascript Object.extend
2010/05/18 Javascript
jquery模拟SELECT下拉框取值效果
2013/10/23 Javascript
jQuery实现新消息闪烁标题提示的方法
2015/03/11 Javascript
javascript实现uploadify上传格式以及个数限制
2015/11/23 Javascript
JavaScript+html5 canvas绘制的小人效果
2016/01/27 Javascript
jQuery插件编写步骤详解
2016/06/03 Javascript
jquery实现页面加载效果
2017/02/21 Javascript
React-router v4 路由配置方法小结
2017/08/08 Javascript
Vue+webpack项目基础配置教程
2018/02/12 Javascript
create-react-app使用antd按需加载的样式无效问题的解决
2019/02/26 Javascript
[01:58]2018DOTA2亚洲邀请赛趣味视频——交流
2018/04/03 DOTA
Python3安装Pillow与PIL的方法
2019/04/03 Python
用Python绘制漫步图实例讲解
2020/02/26 Python
在python tkinter界面中添加按钮的实例
2020/03/04 Python
使用jupyter notebook直接打开.md格式的文件
2020/04/10 Python
解决Firefox下不支持outerHTML问题代码分享
2014/06/04 HTML / CSS
美国亚马逊旗下男装网站:East Dane(支持中文)
2019/09/25 全球购物
如果有两个类A,B,怎么样才能使A在发生一个事件的时候通知B
2016/03/12 面试题
汉语专业应届生求职信
2013/10/01 职场文书
中层干部竞争上岗演讲稿
2014/01/13 职场文书
在校大学生个人的自我评价
2014/02/13 职场文书
8和9的加减法教学反思
2014/05/01 职场文书
团支部建设方案
2014/05/02 职场文书
兴趣小组活动总结
2014/05/05 职场文书
超越自我演讲稿
2014/05/21 职场文书
民生工作实施方案
2014/05/31 职场文书
科技工作者先进事迹
2014/08/16 职场文书
PyQt5 QThread倒计时功能的实现代码
2021/04/02 Python
MySQL的InnoDB存储引擎的数据页结构详解
2022/03/03 MySQL
vue postcss-px2rem 自适应布局
2022/05/15 Vue.js
Android实现图片九宫格
2022/06/28 Java/Android