Django框架验证码用法实例分析


Posted in Python onMay 10, 2019

本文实例讲述了Django框架验证码用法。分享给大家供大家参考,具体如下:

验证码

1、作用

  • 在用户登录,注册以及一些敏感操作的时候,我们为了防止服务器被暴力请求,或爬虫爬取,我们可以使用验证码进行过滤,减轻服务器的压力。
  • 验证码需要使用绘图 Pillow
    • pip3 install Pillow
    • 核心API
    • Image
      • 需要模式
      • 尺寸
      • 背景色
    • ImageDraw
      • 绑定画布
      • 模式
      • 封装了绘制的API
      • text
      • point
      • line
      • arch
    • ImageFont
      • 手动指定字体

2、业务流程

绘制验证码图片

background = (10,20,30) // RGB颜色

初始化画布

image = Image.new(‘RGB',(100,50),background)

获取画布中画笔对象

draw = ImageDraw.Draw(image)

绘制验证码,随机四个

font = ImageFont.truetype(‘path',size)
fontcolor = (20,40,60)
draw.text((x,y),'R',font,fontcolor)

返回验证码内容

# 删除画笔
del draw
#保存图片到BytesIO对象
Import io
buf = io.BytesIO()
image.save(buf,'png')
#返回BytesIO中的内容
return HttpResponse(buf.getvalue(),'image/png')

3、代码范例

html页面

<form method="post" action="{% url 'sitesApp:login' %}">
  {% csrf_token %}
    <div class="login">
      <div class="input-group">
       <span class="input-group-addon" id="basic-addon1">用户名</span>
       <input type="text" class="form-control" placeholder="Username" aria-describedby="basic-addon1" name="uName">
      </div>
      <div class="input-group">
       <span class="input-group-addon" id="basic-addon1">密    码</span>
       <input type="text" class="form-control" placeholder="Password" aria-describedby="basic-addon1" name="uPswd">
      </div>
      <div class="input-group">
       <span class="input-group-addon" id="basic-addon1">验证码</span>
       <input type="text" class="form-control" placeholder="Auth code" aria-describedby="basic-addon1" name="uCode">
      </div>
      <div class="vcode">
        <img src="/app/getvcode/" id="vcode">
      </div>
      <input type="submit" class="loginBtn" value="登 录"><br>
    </div>
  </form>
  <script type="text/javascript">
    $(function () {
      $('#vcode').click(function () {
        $(this).attr('src',"/app/getvcode"+Math.random())
      })
    })
  </script>

views视图

'''
生成并返回验证码
'''
def getvcode(request):
  # 随机生成验证码
  population = string.ascii_letters+string.digits
  letterlist = random.sample(population,4)
  vcode = ''.join(letterlist)
  # 保存该用户的验证码
  request.session['vcode']=vcode
  # 绘制验证码
  # 需要画布,长宽颜色
  image = Image.new('RGB',(176,60),color=getRandomColor())
  # 创建画布的画笔
  draw = ImageDraw.Draw(image)
  # 绘制文字,字体所在位置
  path = os.path.join(BASE_DIR,'static','fonts','ADOBEARABIC-BOLDITALIC.OTF')
  font = ImageFont.truetype(path,50)
  for i in range(len(vcode)):
    draw.text((20+40*i,0),vcode[i],fill=getRandomColor(),font=font)
  # 添加噪声
  for i in range(500):
    position = (random.randint(0,176),random.randint(0,50))
    draw.point(position,fill=getRandomColor())
  # 返回验证码字节数据
  # 创建字节容器
  buffer = io.BytesIO()
  # 将画布内容丢入容器
  image.save(buffer,'png')
  # 返回容器内的字节
  return HttpResponse(buffer.getvalue(),'image/png')
# 获取随机颜色
def getRandomColor():
  red = random.randint(0,255)
  green = random.randint(0,255)
  blue = random.randint(0,255)
  return (red,green,blue)

希望本文所述对大家基于Django框架的Python程序设计有所帮助。

Python 相关文章推荐
在Python的Flask框架中构建Web表单的教程
Jun 04 Python
Python中Selenium模拟JQuery滑动解锁实例
Jul 26 Python
python验证码识别教程之利用投影法、连通域法分割图片
Jun 04 Python
python实现狄克斯特拉算法
Jan 17 Python
Python3解释器知识点总结
Feb 19 Python
Python自动化运维之Ansible定义主机与组规则操作详解
Jun 13 Python
python按键按住不放持续响应的实例代码
Jul 17 Python
python3 实现的对象与json相互转换操作示例
Aug 17 Python
Python银行系统实战源码
Oct 25 Python
python实现输入的数据在地图上生成热力图效果
Dec 06 Python
Windows下Anaconda和PyCharm的安装与使用详解
Apr 23 Python
PyTorch在Windows环境搭建的方法步骤
May 12 Python
Python爬虫实现验证码登录代码实例
May 10 #Python
详解如何管理多个Python版本和虚拟环境
May 10 #Python
不到40行代码用Python实现一个简单的推荐系统
May 10 #Python
Python和Java的语法对比分析语法简洁上python的确完美胜出
May 10 #Python
Python3列表内置方法大全及示例代码小结
May 10 #Python
详解python 爬取12306验证码
May 10 #Python
详解用python写一个抽奖程序
May 10 #Python
You might like
php array_merge下进行数组合并的代码
2008/07/22 PHP
PHP判断是否为空的几个函数对比
2015/04/21 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
JavaScript中URL编码函数代码
2011/01/11 Javascript
在表单提交前进行验证的几种方式整理
2013/07/31 Javascript
基于NodeJS的前后端分离的思考与实践(五)多终端适配
2014/09/26 NodeJs
js获取当前日期时间及其它操作汇总
2015/04/17 Javascript
jquery实现简洁文件上传表单样式
2015/11/02 Javascript
JavaScript tab选项卡插件实例代码
2016/02/23 Javascript
JavaScript实现拖拽元素对齐到网格(每次移动固定距离)
2016/11/30 Javascript
jQuery图片切换动画效果
2017/02/28 Javascript
vue组件间通信解析
2017/03/01 Javascript
js仿网易表单及时验证功能
2017/03/07 Javascript
20170918 前端开发周报之JS前端开发必看
2017/09/18 Javascript
VUEJS 2.0 子组件访问/调用父组件的实例
2018/02/10 Javascript
vue项目实战总结篇
2018/02/11 Javascript
Node.js 进程平滑离场剖析小结
2019/01/24 Javascript
Websocket 向指定用户发消息的方法
2020/01/09 Javascript
基于Django的ModelForm组件(详解)
2017/12/07 Python
python 递归深度优先搜索与广度优先搜索算法模拟实现
2018/10/22 Python
python异步存储数据详解
2019/03/19 Python
python腾讯语音合成实现过程解析
2019/08/01 Python
Matplotlib使用Cursor实现UI定位的示例代码
2020/03/12 Python
简单了解pytest测试框架setup和tearDown
2020/04/14 Python
Python爬虫如何应对Cloudflare邮箱加密
2020/06/24 Python
Keras: model实现固定部分layer,训练部分layer操作
2020/06/28 Python
windows+vscode安装paddleOCR运行环境的步骤
2020/11/11 Python
摩顿布朗英国官方网上商店:奢华沐浴、身体和头发护理
2016/10/29 全球购物
罗马尼亚在线杂货店:Pilulka.ro
2019/09/28 全球购物
Myprotein荷兰官网:欧洲第一运动营养品牌
2020/07/11 全球购物
《天游峰的扫路人》教学反思
2014/04/25 职场文书
就业协议书
2014/09/12 职场文书
2015年小学中秋节活动总结
2015/03/23 职场文书
乡镇团委工作总结2015
2015/05/26 职场文书
爸爸的三轮车观后感
2015/06/16 职场文书
Android超详细讲解组件ScrollView的使用
2022/03/31 Java/Android