验证码源代码 validcode_img.py:
import random #导入随机模块
def get_random_color():
# 获取随机的颜色 RGB
return (random.randint(0,255),random.randint(0,255),random.randint(0,255))
def get_validcode_img(request):
from PIL import Image,ImageDraw,ImageFont
from io import BytesIO
import random
# 获取图片颜色,定义图片的宽270,高40,颜色调用随机颜色的函数
img = Image.new("RGB",(350,40),color=get_random_color())
# 画出来
draw = ImageDraw.Draw(img)
# 添加字体
kumo_font = ImageFont.truetype("static/front/font/kumo.ttf", size=32) # 字体 字体大小
# 定义随机验证码
validcode_str = ""
for i in range(5):
random_num = str(random.randint(0,9)) #随机数字【1-9】
random_low_alpha = chr(random.randint(95,122)) #随机小写字母【a-z】
random_upper_alpha = chr(random.randint(65,90)) #随机大写字母【A-Z】
# 在这三个序列里随机选择5次,成立验证码
random_char = random.choice([random_num,random_low_alpha,random_upper_alpha])
# 生成图片验证码 设置每一次循环的验证码出现的间距(i*50+20,5)这里的5指的是:随机生成5个验证码。
draw.text((i*60+50,5),random_char,get_random_color(),font=kumo_font)
validcode_str += random_char #把生成的random_char 加入自定义的validcode_str
width = 270
height = 40
# 设置随机颜色的线段
for i in range(20):
# 定义随机的x轴
x = random.randint(0,width)
# 定义随机的y轴
y = random.randint(0,height)
draw.arc((x,y,x+4,y+4),0,90,fill=get_random_color())
print("validcode_str",validcode_str)
# 把生成的图片验证码存入session
request.session['validcode_str'] = validcode_str
f = BytesIO()
img.save(f,'png')
data = f.getvalue()
return data
基于PIL模块动态生成响应状态码图片:
def get_validcode_img(request):
img_data = validcode_img.get_validcode_img(request)
return HttpResponse(img_data)
# 图片验证码结束
HTML中页面:
{#图片验证码开始#}
<div>
<img alt="" width="270" height="36" id="valid_code_img" src="{% url 'blog:get_validcode_img' %}" onclick="this.src='/blog/get_validcode_img/?'+Math.random()">
</div>
<div>
验证码:<input type="text" name="validcode" value="">
</div>
{#图片验证码结束#}
图片URL开始
# 获取图片验证码开始
re_path('get_validcode_img/',login.get_validcode_img,name="get_validcode_img"),
# 获取图片验证码结束