Django之验证码的实现,简单快捷的方法

实现验证码随网页变动即时刷新,实现有期限时间
请确保安装好pillow
直接show code:
0、路由urs.py

from django.urls import path, re_path
from . import views
urlpatterns = [re_path(r'^test/$', views.testpage, name='test'),re_path(r'^captcha/$', views.captcha, name='captcha'),
]

1、定义生成验证码views.py

import os, random, time, string, io
from django.shortcuts import render
from django.http import HttpResponse
from PIL import Image, ImageDraw, ImageFont
#  生成验证码,# 可以直接可以在html中的img引用
def captcha(request):# 定义背景颜色、宽、高bgcolor = (random.randrange(20, 100), random.randrange(20, 100), random.randrange(20, 100))width = 100height = 50# 创建画面对象img = Image.new('RGB', (width, height), bgcolor)# 创建画笔对象draw = ImageDraw.Draw(img)# 调用画笔的point()函数绘制验证码的干扰点for i in range(0, 100):xy = (random.randrange(0, width), random.randrange(0, height))fill = (random.randrange(0, 255), random.randrange(0, 255), 55)draw.point(xy, fill=fill)# 定义验证码的备选值_str = string.digits + string.ascii_letters# 随机取四个值作为验证码rand_codes = ''.join(random.sample(_str, 4))# 定义字体大小size = int(min(width / len(rand_codes), height))# 构造字体对象font = ImageFont.truetype(r'C:\Windows\Fonts\Arial.ttf', size)# 构造字体颜色,四个字颜色不同for i in range(4):fontcolor = (255, random.randrange(0, 255), random.randrange(0, 255))draw.text((i * 25, 2), rand_codes[i], font=font, fill=fontcolor)# 释放画笔del draw# # 将验证码缓存入session,后面做进一步验证,注意应该在这里存入的时候变为小写,# 否则验证码过期就变成了空,再进行lower()操作会抛出异常request.session['verify_code'] = rand_codes.lower()# 验证码有效时间60秒request.session.set_expiry(60)print("生成的验证码是:", rand_codes)print("它应该是与session存的验证码一样:", request.session['verify_code'])buf = io.BytesIO()img.save(buf, 'png')# 将内存中的图片数据返回给客户端,MIME类型为png图片return HttpResponse(buf.getvalue(), 'image/png')# 这样也行# return HttpResponse(buf.getvalue(), 'jpg')

关键点在于io.BytesIO()函数和它的getvalue()函数
BytesIO()使用的是Binary I/O(也叫buffered I/O)的方法,它的处理对象必须是字节类对象(bytes-like object),生成的对象是字节(bytes),这个过程不执行解码、编码和换行转换。这种类型的数据流可以用于所有非文本类的的数据(也就是二进制文件或二进制读取的文本,如图片、gif,以二进制读取的.txt,.py,.html等文件)。

而getvalue()返回储存在缓存中对象整个内容的字节

总之只要理解为:BytesIO()直接以二进制方式读取jpg、png、gif等文件并将它存于缓存中,而getvalue()方法则是将它从缓存中取出来,还原成原来的样子显示给我们看。

2、路由导航函数views.py

# 测试页
def testpage(request):verify_msg = ''_captcha_submit = request.POST.get('verify_code').lower()# 注意这里提交的code需要小写,而服务器的code已经小写,# 这样分开做是为了避免当验证码过期了变为空值取不到session抛出异常_captcha_server = request.session.get('verify_code')if _captcha_server == _captcha_submit:return render(request, 'axf/test.html', {"msg": "验证成功"})else:verify_msg = '验证失败'return render(request, 'testapp/test.html', {"msg": verify_msg})

3、模板下的HTML页test.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>测试页面</title>
</head>
<body><form action="/test/" method="post"><img src="/captcha/" alt="验证码"/><div><label><input type="text" name="verify_code" placeholder="请输入图片中验证码"></label><input type="submit" value="验证"/></div></form><a>验证结果:</a><p style="color: red">{{msg}}</p>
</body>
</html>

展示结果:

验证码设置了60秒过期,如果过了60秒再输入验证码是不会成功的

Django之验证码的实现,简单快捷的方法相关推荐

  1. 在线qsv转mp4格式有哪些简单快捷的方法

    Qsv转mp4?对待这俩种不同的视频文件格式,我们应该如何转换?转换有哪些简单快捷的方法?在线qsv转mp4又该怎样操作呢?那么,小编今天就来分享一个好的方法给大家,希望可以对你有所帮助. 步骤一:借 ...

  2. django中验证码图片的两种使用方法

    @[T 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 学习的时候参考过很多篇他人的博客,本篇博客是我第一篇学习笔记 一.方法一使用步骤 1.下载库 2.setting中的 ...

  3. SVG格式文件插入Word/WPS,三种简单快捷的方法,实现图片高清无损

    最近在修改论文的时候,发现自己电脑SVG格式文件插入后一直模糊,或者出现插入不成功的情况,研究了一会后,找到了几种简单高校高效的方法,和大家分享一下- Word2019可以直接插入SVG,图片高清无损 ...

  4. 如何将PDF转换成CAD文件?简单快捷的方法分享给你

    怎么把PDF文件转换成CAD文件格式呢?如果有做CAD相关工作的小伙伴,一定会有这样的经历,那就是收到客户发来的PDF格式的CAD文件,一般出现这种情况可能对面不是专业人员,因为光容易发送和打开是不行 ...

  5. 微信怎么发文字朋友圈?简单快捷的方法,只需1分钟

    微信是一个非常受欢迎的聊天工具,也是一个交友,分享生活的平台.其中,朋友圈是最受欢迎的功能之一,让我们可以与好友分享自己的生活点滴,也能够关注他人的动态.那么微信怎么发文字朋友圈呢?下面跟着小编一起来 ...

  6. mpg如何转成mp4格式?四种简单快捷的方法分享

    mpg如何转成mp4格式?MPG是一种视频文件格式,而MP4是一种常见的视频文件格式.尽管它们都属于MPEG标准,但它们之间存在一些重要的区别.MPG这种格式最初设计用于存储光盘内容,比如视频CD和D ...

  7. 如何把图片转换成PDF?4种简单快捷的方法,一键将图片转PDF

    分享4种图片转PDF的方法,转换速度快,而且能够保持图片画质清晰,不管是单个图片转换还是多个图片转换,都能满足你! 一.单张图片转PDF 1.照片查看器 直接使用Win10中自带的图片查看器,就能将图 ...

  8. Web简单快捷的指纹识别小工具_在线指纹识别平台设计

    Web 指纹识别 本文通过分析 Web 指纹的检测对象.检测方法.检测原理及常用工具,设计了一个简易的指纹搜集脚本来协助发现新指纹,并提取了多个开源指纹识别工具的规则库并进行了规则重组,开发了一个简单 ...

  9. 中科院计算所开源Easy Machine Learning:让机器学习应用开发简单快捷 By 机器之心2017年6月13日 13:05 今日,中科院计算所研究员徐君在微博上宣布「中科院计算所开源了

    中科院计算所开源Easy Machine Learning:让机器学习应用开发简单快捷 By 机器之心2017年6月13日 13:05 今日,中科院计算所研究员徐君在微博上宣布「中科院计算所开源了 E ...

最新文章

  1. 程序员感悟----路该怎么走
  2. Postfix+Amavisd-new+Spamassassin+ClamAV整合安装
  3. python查找最长公共前缀_Python实现查找字符串数组最长公共前缀示例
  4. SVN本地代码未提交而被覆盖
  5. 实验2 java_《Java程序设计》实验2
  6. java 入参 是 枚举_java 枚举 参数传递
  7. async await 的前世今生(Updated)
  8. 将多张图片转为avi视频,再转为h264文件
  9. 【java笔记】list接口
  10. ModuleNotFoundError: No module named ‘pyemd‘ 解决
  11. 工作4-5年的.NET开发人员也需要有人带带才可以保证软件项目的质量
  12. 算法——排序——归并排序图解动画
  13. pgadmin4 本地安装部署
  14. sql语句动态拼接多个查询条件查询数据库
  15. 爬虫之requests模块
  16. 存量用户时代,方兴未艾的客户服务SaaS
  17. 反向代理和正向代理的概念
  18. 考研报名登录显示服务器错误,2018年考研报名常见问题:填写网报信息
  19. [SSD固态硬盘技术 4] 主控详解
  20. PVE虚拟机篇-pve软件换源

热门文章

  1. 需求分析中对系统的要求
  2. 计算机二级access选择题技巧,计算机二级access考试注意事项及解题技巧策略
  3. java如何限制输入值_[限制input输入类型]常用限制input方法
  4. 使用 Django + Wusgi + Nginx 部署 Django
  5. python编写装饰器_我也来写一下python装饰器
  6. 作业帮电脑版在线使用_作业帮:创新科技驱动在线教育新模式
  7. 解决 :sudo:/etc/sudoers 可被任何人写
  8. Python把函数作为参数传入的高阶编程方法
  9. 嵌入式常见笔试题总结
  10. 引用js_js值和引用