如何制作验证码

打印 上一主题 下一主题

主题 673|帖子 673|积分 2019

推导步骤1:在img标签的src属性里放上验证码的请求路径
  1. 补充1.img的src属性:
  2.         1.图片路径
  3.         2.url
  4.         3.图片的二进制数据
  5. 补充2:字体样式
  6.         我们计算机上之所以可以输出各种各样的字体样式,其内部其实对应的是一个个以.ttf结尾的文件
  7.        
  8. 由于img的src属性里可以放图片的二进制数据,因此我们可以在src里放上图片的请求路径,返回的是一个图片的二进制数据
  9. <img src="https://www.cnblogs.com/get_code/" alt="" width="350" height="35">
  10. # 该视图函数返回的是图片的二进制数据,图片是本地已有的图片路径
  11. def get_code(request):
  12.     with open ('static/img/default.png','rb') as f:
  13.         data = f.read()
  14.     return HttpResponse(data)
复制代码
字体样式网站
推导步骤2:利用pillow模块动态产生图片
  1. """
  2. 图片相关的模块:
  3.         pip3 install pillow
  4. 导入:from PIL import Image,ImageDraw,ImageFont
  5. Image:生成图片
  6. ImageDraw:能够在图片上乱涂乱画
  7. ImageFont:控制字体样式
  8. """
  9. from PIL import Image,ImageDraw,ImageFont
  10. import random
  11. def get_random():
  12.     return random.randint(0,255),random.randint(0,255),random.randint(0,255),
  13. def get_code(request):
  14.     1.先产生一个图片,new方法的第一个参数是固定模式RGB格式,第二个是图片大小(宽,高),第三个是图片颜色(可以放rgb模式的颜色)
  15.     # image_obj = Image.new('RGB',(350,35),'green') # 固定颜色
  16.     # image_obj = Image.new('RGB',(350,35),(23,43,53)) # 变形1
  17.     image_obj = Image.new('RGB', (350, 35), get_random()) # 变形2
  18.     2.将产生的图片存起来,打开一个文件,该图片有一个save方法可以存储图片,第一个参数是文件句柄,第二个是存储图片格式
  19.     with open('xxx.png','wb') as f:
  20.         image_obj.save(f,'png')
  21.     3.再将图片以二进制形式读出来,返回给img标签的src属性
  22.     with open('xxx.png','rb') as f:
  23.         data = f.read()
  24.     return HttpResponse(data)
复制代码
上述方法:会进行频繁的文件存储IO操作,效率比较低下,步骤4利用内存管理器模块优化!
推导步骤4:利用内存管理器模块优化
  1. """
  2. 导入内存管理器模块:from io import BytesIO,StringIO
  3. BytesIO:功能临时帮您存储数据,返回的数据是二进制
  4. StringIO:功能临时帮您存储数据,返回的数据是字符串
  5. """
  6. def get_code(request):
  7.     # 1.同样先生成一个图片对象
  8.     image_obj = Image.new('RGB', (350, 35), get_random())
  9.     # 2.这里再生成一个内存管理器对象,就可以看成是f文件句柄
  10.     io_obj = BytesIO()
  11.     # 3.将图片保存到文件管理器对象里
  12.     image_obj.save(io_obj,'png')
  13.     # 4.把图片从文件管理器对象里取出来,用getvalue()方法
  14.     return HttpResponse(io_obj.getvalue())
复制代码
最终步骤:写图片验证码
  1. def get_code(request):
  2.     # 1.同样先生成一个图片对象
  3.     image_obj = Image.new('RGB', (350, 35), get_random())
  4.     # 2.在图片上生成一个画笔对象
  5.     img_draw = ImageDraw.Draw(image_obj)
  6.     # 3.设置字体样式,truetype()第一个参数是字体样式路径,第二个是字体大小
  7.     img_font = ImageFont.truetype('static/font/222.ttf',30)
  8.     # 4.随机生成验证码,五位,大小写字母、数字
  9.     code = ''
  10.     for i in range(5):
  11.         random_upper = chr(random.randint(65,90)) # 65-90的数字使用chr()函数对应转成大写字母
  12.         random_lower = chr(random.randint(97,122)) # 97-122的数字使用chr()函数对应转成小写字母
  13.         random_int = str(random.randint(0,9))
  14.         # 从上面三种随机选择一种
  15.         tmp = random.choice([random_int,random_lower,random_upper])
  16.         # 将产生的随机字符串写到图片上
  17.         """
  18.         text()方法的第一个参数,字符串在图片上的坐标,第二个是字符串,
  19.         第三个字符串的颜色,第四个字体样式和大小
  20.         """
  21.         img_draw.text((i*60,0),tmp,get_random(),img_font)
  22.         code += tmp
  23.     print(code)
  24.     # 5.将生成的随机验证码保存起来,因为在登录的视图函数需要用到,进行比对
  25.     request.session['code'] = code
  26.     # 6.再生成一个内存管理器对象,就可以看成是f文件句柄
  27.     io_obj = BytesIO()
  28.     # 7.将图片保存到文件管理器对象里
  29.     image_obj.save(io_obj,'png')
  30.     # 8.把图片从文件管理器对象里取出来,用getvalue()方法
  31.     return HttpResponse(io_obj.getvalue())
复制代码
补充

如何让用户一点验证码图片就刷新验证码
  1. <img src="https://www.cnblogs.com/get_code/" alt="" width="350" height="35" id="img">
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

熊熊出没

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表