不学网

 找回密码
 立即注册

只需一步,快速开始

手机号码,快捷登录

查看: 241|回复: 0

[python] Django生成图片验证码

[复制链接]
jasonlv 发表于 2018-4-14 18:58:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
前端界面随便写的,想好看点的话引用bootstrap模板 或 网上down一些现成的模板;
1、前端HTML代码如下:
  1. <!DOCTYPE html>

  2. <html lang="en">

  3. <head>

  4.     <meta charset="UTF-8">

  5.     <title>登录</title>

  6. </head>

  7. <body>

  8. <form action="/login/" method="post">

  9.     {% csrf_token %}

  10.     <div>

  11.         <label for="uname">用户名</label>

  12.         <input type="text" name="uname" id="uname">

  13.     </div>

  14.     <div>

  15.         <label for="passwd">密码</label>

  16.         <input type="password" name="passwd" id="passwd">

  17.     </div>

  18.     <input type="button" value="登录" id="popup-submit">

  19.     <span> {{ errorinfo }}</span>



  20.     <div id="popup-captcha"></div>



  21.     <span>

  22.         <img src="/verify_code/" alt="" width="200px" height="35px">

  23.     </span>

  24. </form>

  25. <a href="/index/">进入首页</a>

  26. </body>

  27. </html>
复制代码

[backcolor=rgba(255, 255, 255, 0.8)]2、后端Django代码如下:
  1. # 图片验证码生成

  2. def verify_code(request):

  3.     import PIL

  4.     import random

  5.     from PIL import Image

  6.     from PIL import ImageDraw, ImageFont

  7.     from io import BytesIO



  8.     def get_random_color():

  9.         # 随机生成三原色的数值,返回数组

  10.         color_red = random.randint(0,255)

  11.         color_green = random.randint(0,255)

  12.         color_blue = random.randint(0,255)

  13.         return (color_red,color_green,color_blue)



  14.     image_obj  = Image.new("RGB",(200,35),"#D0D0D0")   # 设置图片的配色模式,图片大小,背景色



  15.     draw_obj = ImageDraw.Draw(image_obj)



  16.     font = ImageFont.truetype("./static/font/kumo.ttf",size=28)    #导入字体格式模板文件



  17.     # 生成验证码的5个随机字符

  18.     temp = []

  19.     for i in range(1,6):

  20.         verify_num = str(random.randint(0,9))  #随机返回0 ~ 9 的数字,无顾头不顾尾的特性

  21.         verify_low = chr(random.randint(97,122))   #随机返回小写字母

  22.         verify_upper = chr(random.randint(65,90))   #随机返回小写字母

  23.         random_char = random.choice([verify_num,verify_low,verify_upper])   #随机返回一个列表中的数字、小写字母、大写字母,string

  24.         draw_obj.text((i * 32 , 2), random_char, get_random_color(),font = font)    #将文字渲染到draw_obj对象中

  25.         temp.append(random_char)    #将随机字符保存进列表



  26.     # 噪点噪线

  27.     width=200

  28.     height=30

  29.     # 循环次数即躁线数量

  30.     for i in range(5):

  31.         x1=random.randint(0,width)

  32.         x2=random.randint(0,width)

  33.         y1=random.randint(0,height)

  34.         y2=random.randint(0,height)

  35.         draw_obj.line((x1,y1,x2,y2),fill=get_random_color())

  36.     # 循环次数即早点数量

  37.     for i in range(20):

  38.         draw_obj.point([random.randint(0, width), random.randint(0, height)], fill=get_random_color())

  39.         x = random.randint(0, width)

  40.         y = random.randint(0, height)

  41.         draw_obj.arc((x, y, x + 4, y + 4), 0, 90, fill=get_random_color())



  42.     #在内存中生成图片

  43.     f = BytesIO()   #实例化内存对象

  44.     image_obj.save(f,"png") #将image_obj对象中的数据保存到内存中,类型是PNG

  45.     imgdata = f.getvalue() #从内存中读出来图像数据

  46.     f.close()   #关闭内存对象f



  47.     valid_str ="".join(temp)    # 将temp列表转换成字符串,得到完整的字符验证码

  48.     request.session["valid_str"] = valid_str    # 将验证码保存到session中



  49.     return HttpResponse(imgdata)
复制代码


[backcolor=rgba(255, 255, 255, 0.8)]本文地址:http://www.jasonlv.cc

回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|不学网

GMT+8, 2018-7-23 08:10

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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