生成随机验证码(图片)

首先要导入生成图片相关模块:

from PIL import Image, ImageDraw, ImageFont

"""
Image:生成图片
ImageDraw:能够在图片上乱涂乱画
ImageFont:控制字体样式
"""

 

为图片生成随机三基色

def get_random():
    return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)

 

定义生成随机验证码函数:

def get_code(request):
    # 最终步骤:写图片验证码
    img_obj = Image.new('RGB', (430, 35), get_random()) # 模式 字体大小 颜色
    img_draw = ImageDraw.Draw(img_obj)  # 产生一个画笔对象
    img_font = ImageFont.truetype('static/font/111.ttf', 30)  # 字体样式 大小

    # 随机验证码 五位数 数字 小写字母 大写字母
    code = ''
    for i in range(5):
        random_upper = chr(random.randint(65, 90))
        random_lower = chr(random.randint(97, 122))
        random_int = str(random.randint(0, 9))
        # 从上面三个随机选择一个
        tmp = random.choice([random_upper, random_lower, random_int])
        # 将产生的随机字符串写入到图片上
        """
        为什么一个个写而不是生成好了之后再写
        因为一个个写能够控制每个字体的间隙 而生成好之后再写的话
        间隙就没法控制了
        """
        img_draw.text((i * 60 + 60, -2), tmp, get_random(), img_font)
        # 拼接随机字符串
        code += tmp
    print(code)

 

 

再导入前端存储图片(内存管理器)模块:

from io import BytesIO, StringIO

"""
内存管理器模块
BytesIO:临时帮你存储数据 返回的时候数据是二进制
StringIO:临时帮你存储数据 返回的时候数据是字符串
"""

 

在生成随机验证码函数内往后书写:

# 随机验证码在登录的视图函数里面要用到 比对 所以需要存起来并且其他视图函数也能拿到
    request.session['code'] = code
    io_obj = BytesIO()
    img_obj.save(io_obj, 'png')
    return HttpResponse(io_obj.getvalue())

 

posted @ 2023-11-12 21:02  wellplayed  阅读(18)  评论(0编辑  收藏  举报