views.py
def verifycode(req):
# 1. 创建画布Image对象
img = Image.new(mode='RGB', size=(120, 30), color=(220, 220, 180))
# 2. 创建画笔 ImageDraw对象
draw = ImageDraw.Draw(img, 'RGB')
# 3. 画文本,画点,画线
# 随机产生0-9, A-Z, a-z范围的字符
chars = ''
while len(chars) < 4:
flag = random.randrange(3)
char = chr(random.randint(48, 57)) if not flag else \
chr(random.randint(65, 90)) if flag == 1 else \
chr(random.randint(97, 122))
# 排除重复的
if len(chars) == 0 or chars.find(char) == -1:
chars += char
# 将生成的验证码的字符串存入到session中
req.session['verifycode'] = chars
font = ImageFont.truetype(font='static/fonts/hktt.ttf', size=25)
for char in chars:
xy = (15+chars.find(char)*20, random.randrange(2, 8))
draw.text(xy=xy,
text=char,
fill=(255, 0, 0),
font=font)
for i in range(200):
xy = (random.randrange(120), random.randrange(30))
color = (random.randrange(255),
random.randrange(255),
random.randrange(255))
draw.point(xy=xy, fill=color)
# 4. 将画布对象转成字节数据
buffer = BytesIO() # 缓存
img.save(buffer, 'png') # 指定的图片格式为png
# 5. 清场(删除对象的引用)
del draw
del img
return HttpResponse(buffer.getvalue(), # 从BytesIO对象中获取字节数据
content_type='image/png')