标签:缓存 views pil rgb res else 颜色 验证码 保存
html页面里
{# 验证码 #} <div class="form-group " id="v-code-wrapper"> <label for="v_code_input">验证码</label> <input type="text" class="form-control" id="v_code_input" name="v_code_input"> <img src="/get_v_code/" class="" id="v_code"> </div>
js里
{#当图片的src改变时,浏览器会自动访问该地址,所以此处点击验证码图片,触发事件改变src地址内容,用以改变验证码图片#} $(‘#v_code‘).click(function () { if (this.src == ‘/get_v_code/‘) { this.src += ‘?‘; } else { this.src = ‘/get_v_code/‘; } });
views.py文件里
# 因为页面控制每次点击图片在连接后加? 或减去?,url一直都是这两个,Django会自动将这两个url的执行加入缓存,所以每次会获得一样的验证图片 # 该语法糖 告诉系统不要对该方法进行缓存操作 @never_cache def get_v_code(request): from PIL import Image, ImageDraw, ImageFont import random # 定义生成一个随机颜色代码的内部函数 def get_color(): return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255) # 生成一个图片对象 img_obj = Image.new( ‘RGB‘, # 图片格式 (166, 37), # 图片大小 color=get_color() ) # 在图片中加文字 # 生成一个画笔对象 draw_obj = ImageDraw.Draw(img_obj) # 加载字体文件 font_obj = ImageFont.truetype(‘static/font/kumo.ttf‘, size=28) # 循环5次,每次往图片上写入一个随机字符 tmp_list = [] for i in range(5): n = str(random.randint(0, 9)) l = chr(random.randint(97, 122)) u = chr(random.randint(65, 90)) r = random.choice([n, l, u]) tmp_list.append(r) draw_obj.text( (i * 30 + 10, 0), # 位置 r, # 内容 get_color(), # 颜色 font=font_obj, ) # 得到随机验证码 v_code = ‘‘.join(tmp_list) request.session[‘v_code‘] = v_code.upper() # 第一种,将图片保存到文件(硬盘),然后再返回到页面 # with open(‘vv.png‘, ‘wb‘)as f: # img_obj.save(f, ‘png‘) # with open(‘vv.png‘, ‘rb‘)as f: # return HttpResponse(f.read(), content_type=‘imge/png‘) # 第二种,直接将图片放在内存中,返回回去 from io import BytesIO tmp = BytesIO() # 生成一个IO对象 img_obj.save(tmp, ‘png‘) data = tmp.getvalue() return HttpResponse(data, content_type=‘imge/png‘)
标签:缓存 views pil rgb res else 颜色 验证码 保存
原文地址:https://www.cnblogs.com/95lyj/p/9265825.html