利用 PIL模块实现生成动态验证码
Posted changwenjun-666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用 PIL模块实现生成动态验证码相关的知识,希望对你有一定的参考价值。
简单说下需求:
当用户点击动态框时,实现实时更换动态库里的数字更换
模块: PIL io
前端页面:
<img src="/get_code/" id="id_img" width="260" height="35">
<script>
$(‘#id_img‘).click(function ()
let old_path = $(‘#id_img‘).attr(‘src‘);
$(this).attr(‘src‘, old_path += ‘?‘)
);
</script>
路由层:
url(r‘^get_code/‘,views.get_code)
视图层
# PIl模块可以实现动态生成图像 from PIL import Image, ImageDraw, ImageFont, ImageFilter #Image 生成图片 #ImageDraw 在图片上写字 #ImageFont 控制字体样式 from io import BytesIO #保存数据,并且在取的时候会以字节的形式返回,,StringIo 字符串形式返回 #图片颜色动态变化,图片存放不依赖与文件的形式 def get_code(request): # img_obj = Image.new(‘RGB‘,(260,35),get_random()) # #生成一个BytesIo对象 # io_obj = BytesIO() #将这个对象看成文件句柄 # img_obj.save(io_obj,‘png‘) # 将图片数据存入内存管理器中 需要指定图片格式 # return HttpResponse(io_obj.getvalue()) # 将保存的数据以二进制的数据返回出来 img_obj = Image.new(‘RGB‘,(260,35),get_random()) #生成一个画笔对象 img_draw = ImageDraw.Draw(img_obj) #拿着画笔就可以在图片上为所欲为 #生成字体样式 img_font = ImageFont.truetype(‘static/font/11.ttf‘,30) #30为字体大小 #随即验证码 数字+大小写字母 code = ‘‘ #定义一个变量存储验证码 for i in range(5): random_int = str(random.randint(0,9)) random_lower = chr(random.randint(97,122)) random_upper = chr(random.randint(65,90)) temp_code = random.choice([random_int,random_lower,random_upper]) # 在生成的当个验证码中随即一个 #将产生的字一个一个的写在图片上 img_draw.text((60+i*30, 0),temp_code,get_random(),img_font) # code 记录 code += temp_code print(code) #考虑到需要比对验证码,选择将code存放到session表里 request.session[‘code‘] = code #生成io对象 io_obj = BytesIO() #可以将字体 改的模糊一些 可选项 img_obj = img_obj.filter(ImageFilter.BLUR) img_obj.save(io_obj,‘png‘) return HttpResponse(io_obj.getvalue())
#生成颜色构成三原色数字 import random def get_random(): return random.randint(0,255),random.randint(0,255),random.randint(0,255)
整理版:
def get_random(): return random.randint(0,255),random.randint(0,255),random.randint(0,255) def get_code(request): img_obj = Image.new(‘RGB‘,(260,35),get_random()) # 生成图像对象 img_draw = ImageDraw.Draw(img_obj) # 生成画笔对象 img_font = ImageFont.truetype(‘static/font/1.ttf‘,30) #生成字体对象 code = ‘‘ #用来保存生成的随机码 for i in range(6): random_int = str(random.randint(0,9)) random_lower = chr(random.randint(97,122)) random_upper = chr(random.randint(65,90)) temp_code = random.choice([random_int,random_lower,random_upper]) code += temp_code img_draw.text((60+i*30,0),temp_code,get_random(),img_font) # 指定xy,数据,颜色的样式,字体样式 # print(code) request.session[‘code‘] = code # 作为session保存,用来验证前端传过来的随机码 io_obj = BytesIO() # 保存数据做准备,生成一个io对象,并且在取的时候会以字节的形式返回 img_obj = img_obj.filter(ImageFilter.BLUR) # 将字体改的模糊一些 img_obj.save(io_obj,‘png‘) # 保存数据,需要指定图片格式 return HttpResponse(io_obj.getvalue()) # 固定格式,取值返回给前端页面
以上是关于利用 PIL模块实现生成动态验证码的主要内容,如果未能解决你的问题,请参考以下文章