html页面里
{ # 验证码 #}
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_cachedef 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')