实现效果:点击右边图片验证码会变

前端代码:

<div class="container">
<div class="row">
<div class="col-md-6">
<label for="yzm_id">验证码:</label>
<input type="text" class="form-control" id="yzm_id" placeholder="" name="yzm">
</div>
<div class="col-md-6">
<img id='yzm_img_id' src="/yzm/" alt="" style="width: 260px;height: 40px">
</div>
</div>
<div>

一个input输入框和一个用div包裹的img标签,用Bootstrap的栅格系统各占6格(只是为了美观,可以不用样式)

后端代码:

from PIL import Image,ImageDraw,ImageFont
from io import BytesIO,StringIO
#色彩的设置为(*,*,*),所以随机返回三个数
def r_num(number):
#number为2指的是背景颜色,把背景颜色和字体颜色分开,不然当颜色一样时,不容易看到
if number==2:
return random.randint(0,128),random.randint(0,128),random.randint(0,128)
#number==1指的是字体颜色,字体颜色深一些比较养眼
if number == 1:
return random.randint(128, 255), random.randint(128, 255), random.randint(128, 255)
def yzm(request):
#创建一个Image对象,‘RGB’是颜色的模式。第二个参数是验证码的大小。第三个参数是三个随机数,当然也用英语单词指定颜色,比如red,这里为了随机性选择了用三个数字
yzm_img=Image.new("RGB",(260,40),r_num(1))
#为yzm_img对象创建一个画笔
draw=ImageDraw.Draw(yzm_img)
#指定字体的格式,ttf文件自己在网上下载,放入static文件夹中,40指的是字体的大小
font=ImageFont.truetype('static/1.ttf',40)
#存放验证码
code=''
#循环5次,所以验证码是5位
for i in range(5):
#随机0到9的数字
random_num=str(random.randint(0,9))
#随机65到90的数字,chr是把数字对比ASCLL码表转为字母。65到90是大写字母
random_up=str(chr(random.randint(65,90)))
#同上,随机小写字母
random_low=str(chr(random.randint(97,122)))
#从三个字符中随机选取出一个
random_code=random.choice([random_num,random_up,random_low])
#把字符写入图片。第一个参数(x,y),坐标,如果坐标位置写死,那么将会全部挤到一起,第二个参数,指定写入的字符。第三参数指定字符的格式
draw.text((45*i,-5),random_code,r_num(2),font)
code+=random_code
io_obj=BytesIO()
#把图片存放到内存空间中
yzm_img.save(io_obj,'png')
#给session中添加验证码
request.session['code']=code
#返回二进制数据
return HttpResponse(io_obj.getvalue())

现在刷新就可以刷新验证码了

还差点击验证码就能更换验证码

前端脚本代码:

这里这么写是因为只要在地址后面加上字符,那么就刷新图片

 $('#yzm_img_id').click(function () {
var path2 = $(this).attr('src');
$(this).attr('src', path2 += '?')
});

Django之随机图形验证码的更多相关文章

  1. 基于Django的python验证码

    验证码 在用户注册.登录页面,为了防止暴力请求,可以加入验证码功能,如果验证码错误,则不需要继续处理,可以减轻一些服务器的压力 使用验证码也是一种有效的防止crsf的方法 验证码效果如下图: 验证码视 ...

  2. 72、django之简单验证码实现与form表单钩子函数补充

    本篇主要讲解简单的验证码实现,验证码使用基本都是找现成的组件来实现,用代码实现这个简单功能主要是了解了解验证码内部的实现. 本篇导航: 五位验证码图示 代码实现 登录验证 Form组件钩子函数补充 一 ...

  3. django 发送手机验证码

    一.流程分析: 1.用户在项目前端,输入手机号,然后点击[获取验证码],将手机号发到post到后台. 2.后台验证手机号是否合法,是否已被占用,如果通过验证,则生成验证码,并通过运行脚本,让短信运营商 ...

  4. django之简单验证码实现与form表单钩子函数补充

    本篇主要讲解简单的验证码实现,验证码使用基本都是找现成的组件来实现,用代码实现这个简单功能主要是了解了解验证码内部的实现. 本篇导航: 五位验证码图示 代码实现 登录验证 Form组件钩子函数补充 一 ...

  5. django网页图片验证码功能

    在一个正常的登录系统中,验证码是非常重要的,用于识别人机,毕竟我们都知道,这个世界中存在着万恶的爬虫,验证码有很多种方式,有图片的,有邮件的,有短信的,有拼图的,不管什么样的验证码,目的都是验证访问用 ...

  6. Django框架之验证码生成示例

    一.生成随机颜色的图片 1)前端代码展示 <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  7. django中的验证码

    from django.shortcuts import renderfrom PIL import Imagefrom PIL import ImageDrawfrom PIL import Ima ...

  8. Django之动态验证码的生成

    kind.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  9. Django (八) 中间件&验证码&富文本&缓存

    中间件&验证码&富文本&缓存 1. 中间件&AOP   中间件:是一个轻量级的,底层的插件,可以介入Django的请求和响应过程(面向切面编程) ​ 中间件的本质就是一 ...

随机推荐

  1. css 滚动视差 之 水波纹效果

    核心属性: background-attachment 这个属性就牛逼了, 它可以定义背景图片是相对视口固定, 还是随着视口滚动, 加上这个属性网页瞬间就从屌丝变成 高大上. 我们来看个例子: htm ...

  2. vue客户端渲染首屏优化之道

    提取第三方库,缓存,减少打包体积 1. dll动态链接库, 使用DllPlugin DllReferencePlugin,将第三方库提取出来另外打包出来,然后动态引入html.可以提高打包速度和缓存第 ...

  3. MongoDB【快速入门】

    1.MongDB 简介 MongoDB(来自于英文单词"Humongous",中文含义为"庞大")是可以应用于各种规模的企业.各个行业以及各类应用程序的开源数据 ...

  4. netcore编程之后面对不习惯的xshell黑屏部署,是时候使用jenkins自动化发布工具了

     在很久之前net还只能在windows上部署的时候,或许很多创业公司的朋友发布项目还都是人肉部署,反正windows都是可视化的界面,拖拖拉拉,开开关关还不 是特别麻烦...现如今你的项目需要在li ...

  5. Spring Boot入门(六):使用MyBatis访问MySql数据库(注解方式)

    本系列博客记录自己学习Spring Boot的历程,如帮助到你,不胜荣幸,如有错误,欢迎指正! 本篇博客我们讲解下在Spring Boot中使用MyBatis访问MySql数据库的简单用法. 1.前期 ...

  6. 常用的Java Keytool Keystore命令

    Java keytool是密钥和证书管理工具.它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务.它还允许用户储存他们的 ...

  7. RFI to RCE challenge

    http://www.zixem.altervista.org/RCE/level1.php 构造payload: https://zixem.altervista.org/RCE/level1.ph ...

  8. 将展示内容(div、iframe)放在Expand控件中

    Expand是ArcGIS JavaScript API 4.3推出的一个widget(控件),用于承载一个HTML DOM元素,可以把一个自己编写的div或者是一个其他的Esri widget控件放 ...

  9. redis 特性

    Redis 三大特性: Redis 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用 Redis 不仅支持简单的 键 * 值 类型的数据,  还提供list.set.z ...

  10. win7下建立超级隐藏账户

    win7下建立超级隐藏账户 实验目的: 隐藏用户,不让管理员简单的发现 隐藏方法: 1.命令提示符中创建隐藏账户这种方法只能将账户在"命令提示符"中进行隐藏,而对于"计算 ...