基于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的for和break循环结构中使用else语句的技巧
May 24 Python
Python 正则表达式的高级用法
Dec 04 Python
python中pandas.DataFrame对行与列求和及添加新行与列示例
Mar 12 Python
在CentOS6上安装Python2.7的解决方法
Jan 09 Python
详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
Apr 28 Python
Python中的heapq模块源码详析
Jan 08 Python
Python中文件的写入读取以及附加文字方法
Jan 23 Python
python如何删除文件中重复的字段
Jul 16 Python
在matplotlib中改变figure的布局和大小实例
Apr 23 Python
python 读取、写入txt文件的示例
Sep 27 Python
python基础入门之字典和集合
Jun 13 Python
详解Python flask的前后端交互
Mar 31 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原理之变量(Variables inside PHP)
2013/08/09 PHP
JSON PHP中,Json字符串反序列化成对象/数组的方法
2018/05/31 PHP
抽出www.templatemonster.com的鼠标悬停加载大图模板的代码
2007/07/11 Javascript
让JavaScript拥有类似Lambda表达式编程能力的方法
2010/09/12 Javascript
js实现屏蔽默认快捷键调用自定义事件示例
2013/06/18 Javascript
jquery ajax应用中iframe自适应高度问题解决方法
2014/04/12 Javascript
浅谈 jQuery 事件源码定位问题
2014/06/18 Javascript
在Python中使用glob模块查找文件路径的方法
2015/06/17 Javascript
Angular2表单自定义验证器的实现
2016/10/19 Javascript
connection reset by peer问题总结及解决方案
2016/10/21 Javascript
分享一道关于闭包、bind和this的面试题
2017/02/20 Javascript
webpack下实现动态引入文件方法
2018/02/22 Javascript
jQuery.validate.js表单验证插件的使用代码详解
2018/10/22 jQuery
基于vue2.0实现仿百度前端分页效果附实现代码
2018/10/30 Javascript
微信小程序 slot踩坑的解决
2019/04/01 Javascript
vue-simple-uploader上传成功之后的response获取代码
2020/09/07 Javascript
下载安装setuptool和pip linux安装pip    
2014/01/24 Python
零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版
2014/11/06 Python
TensorFlow实现简单卷积神经网络
2018/05/24 Python
pandas 将list切分后存入DataFrame中的实例
2018/07/03 Python
Selenium定位元素操作示例
2018/08/10 Python
python3.5绘制随机漫步图
2018/08/27 Python
python实现动态创建类的方法分析
2019/06/25 Python
python 使用plt画图,去除图片四周的白边方法
2019/07/09 Python
django-crontab 定时执行任务方法的实现
2019/09/06 Python
python对接ihuyi实现短信验证码发送
2020/05/10 Python
HTML5 canvas基本绘图之绘制曲线
2016/06/27 HTML / CSS
乌克兰网上服装店:Bolf.ua
2018/10/30 全球购物
美国最大和最受信任的二手轮胎商店:Bestusedtires.com
2020/06/02 全球购物
计算机系毕业生推荐信
2013/11/06 职场文书
四风问题自查自纠工作情况报告
2014/10/28 职场文书
财务会计岗位职责
2015/02/03 职场文书
终止解除劳动合同证明书
2015/06/17 职场文书
护士业务学习心得体会
2016/01/25 职场文书
Vue3 Composition API的使用简介
2021/03/29 Vue.js
详解JS数组方法
2021/11/20 Javascript