from PIL import Image, ImageDraw, ImageFont
'''
Image 生成图片
ImageDraw 在图片上写字
ImageFont 字体样式
'''
from io import BytesIO, StringIO
'''
BytesIO 临时在内存中保存数据并且返回bytes格式
StringIO 临时在内存中保存数据并且返回字符串格式
'''
import random
# 生成一个三个值是0-255的一个元组
def get_random():
return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)
# 图片验证码
def get_code(request):
# 1.生成一个图片,图片的颜色是随机产生的
img_obj = Image.new('RGB', (150, 30), get_random())
# 2.将图片交给画笔对象
img_draw = ImageDraw.Draw(img_obj)
# 3. 生成一个字体对象 并设置字体的样式和字体大小
img_font = ImageFont.truetype('static/fonts/2.ttf', 30)
# 4.生成一个bytesio对象来存放图片数据
io_obj = BytesIO()
# 定义一个存储随机验证码的变量
code = ''
# 生成五位随机验证码,有大小写字母和数字
for i in range(5):
random_upper = chr(random.randint(65, 90))
random_lower = chr(random.randint(97, 122))
random_num = str(random.randint(0, 9))
random_choice = random.choice([random_upper, random_lower, random_num])
code += random_choice
# 将每次生成的码设置随机颜色后写入图片
img_draw.text((30 * i, 0), random_choice, get_random(), img_font)
# 将验证码存入session中
request.session['code'] = code
img_obj.save(io_obj, 'png')
return HttpResponse(io_obj.getvalue())