基于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装饰器验证配置文件示例
Feb 24 Python
Python操作SQLite简明教程
Jul 10 Python
深入解析Python中的集合类型操作符
Aug 19 Python
在windows下快速搭建web.py开发框架方法
Apr 22 Python
python实现发送邮件功能代码
Dec 14 Python
Flask框架URL管理操作示例【基于@app.route】
Jul 23 Python
Python测试网络连通性示例【基于ping】
Aug 03 Python
Python写一个基于MD5的文件监听程序
Mar 11 Python
python 对字典按照value进行排序的方法
May 09 Python
python global和nonlocal用法解析
Feb 03 Python
python 爬取疫情数据的源码
Feb 09 Python
scrapy结合selenium解析动态页面的实现
Sep 28 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类的使用 实例代码讲解
2009/12/28 PHP
Destoon实现多表查询示例
2014/08/21 PHP
yii用户注册表单验证实例
2015/12/26 PHP
jquery trim() 功能源代码
2011/02/14 Javascript
读jQuery之五(取DOM元素)
2011/06/20 Javascript
JavaScript中最简洁的编码html字符串的方法
2014/10/11 Javascript
javascript合并表格单元格实例代码
2016/01/03 Javascript
关于动态执行代码(js的Eval)实例详解
2016/08/15 Javascript
Node.js读取文件内容示例
2017/03/07 Javascript
Vue2.x中的父子组件相互通信的实现方法
2017/05/02 Javascript
利用JavaScript实现栈的数据结构示例代码
2017/08/02 Javascript
vue2 全局变量的设置方法
2018/03/09 Javascript
javascript、php关键字搜索函数的使用方法
2018/05/29 Javascript
Vue项目数据动态过滤实践及实现思路
2018/09/11 Javascript
在webstorm开发微信小程序之使用阿里自定义字体图标的方法
2018/11/15 Javascript
js+springMVC 提交数组数据到后台的实例
2019/09/21 Javascript
微信小程序实现带放大效果的轮播图
2020/05/26 Javascript
[02:09]抵达西雅图!中国军团加油!
2014/07/07 DOTA
python中使用sys模板和logging模块获取行号和函数名的方法
2014/04/15 Python
Python设计模式之桥接模式原理与用法实例分析
2019/01/10 Python
Python使用type关键字创建类步骤详解
2019/07/23 Python
Python实现微信翻译机器人的方法
2019/08/13 Python
Python实现某论坛自动签到功能
2019/08/20 Python
python生成器用法实例详解
2019/11/22 Python
Python Numpy 自然数填充数组的实现
2019/11/28 Python
Python reversed反转序列并生成可迭代对象
2020/10/22 Python
ROSEFIELD手表荷兰官方网上商店:北欧极简设计女士腕表品牌
2018/01/24 全球购物
工艺工程师岗位职责
2014/03/04 职场文书
大学军训感言1500字
2014/03/09 职场文书
2014年助理工程师工作总结
2014/11/14 职场文书
事业单位工作人员2015年度思想工作总结
2015/10/15 职场文书
检讨书之工作不认真
2019/08/14 职场文书
Python中requests做接口测试的方法
2021/05/30 Python
Java如何实现树的同构?
2021/06/22 Java/Android
2021好看的国漫排行榜前十名 《完美世界》上榜,《元龙》排名第一
2022/03/18 国漫
python 离散点图画法的实现
2022/04/01 Python