700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 利用 PIL模块实现生成动态验证码

利用 PIL模块实现生成动态验证码

时间:2023-07-08 23:45:23

相关推荐

利用 PIL模块实现生成动态验证码

简单说下需求:

当用户点击动态框时,实现实时更换动态库里的数字更换

模块: PIL io

前端页面:

<img src="/get_code/" alt="" 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_codeprint(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 randomdef 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_codeimg_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()) # 固定格式,取值返回给前端页面

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。