zoukankan      html  css  js  c++  java
  • django项目制作验证码图片

    第一步,安装Pillow

    pip install Pillow

    第二步,创建一个python package,注意,必须有__init__.py文件,然后在windows主机上随意找一个字体文件我这里是simhei.ttf

     第三步,创建一个py文件,内容如下:

    import random
    from PIL import Image,ImageDraw,ImageFont
    import time
    import os
    import string
    
    
    #Captcha验证码
    class Captcha(object):
        #把常亮抽取成类属性
        #字体的位置
        font_path = os.path.join(os.path.dirname(__file__),'simhei.ttf')
        #生成几位数的验证码
        number = 4
        # 生成验证码的宽度和高度
        size = (100,40)
        # 背景颜色,默认白色RGB(red,green,blue)
        bgcolor = (0,0,0)
        #随机字体颜色
        random.seed(int(time.time()))
        fontcolor = (random.randint(200,255),random.randint(100,255),random.randint(100,255))
        # 验证码字体大小
        fontsize = 20
        # 随机干扰线颜色
        linecolor = (random.randint(0,250),random.randint(0,255),random.randint(0,250))
        #是否要加入干扰线
        draw_line = True
        # 是否回执干扰线
        draw_point = True
        #加入干扰线的条数
        line_number = 3
    
        SOURCE = list(string.ascii_letters)
        for index in range(0,10):
            SOURCE.append(str(index))
    
        #用来随机生成一个字符串(包括英文和数字)
        # 定义成类方法,然后是私有的,对象在外面不能直接调用
        @classmethod
        def gene_text(cls):
            return "".join(random.sample(cls.SOURCE,cls.number))
    
        #用来回执干扰线
        @classmethod
        def __gene_line(cls,draw,width,height):
            begin = (random.randint(0,width),random.randint(0,height))
            end = (random.randint(0,width),random.randint(0,height))
            draw.line([begin,end], fill=cls.linecolor)
    
        #用来回执干扰点
        @classmethod
        def __gene_points(cls,draw,point_chance,width,height):
            chance = min(100,max(0,int(point_chance)))
            for w in range(width):
                for h in range(height):
                    tmp = random.randint(0,100)
                    if tmp > 100 - chance:
                        draw.point((w,h),fill=(0,0,0))
        #生成验证码
        @classmethod
        def gene_code(cls):
            width,height = cls.size
            image = Image.new('RGBA',(width,height),cls.bgcolor)#创建画板
            font = ImageFont.truetype(cls.font_path,cls.fontsize)#验证码字体
            draw = ImageDraw.Draw(image)#创建画笔
            text = cls.gene_text()#生成字符串
            font_width,font_height = font.getsize(text)
            draw.text(((width - font_width)/2,(height - font_height)/2),text,font=font,fill=cls.fontcolor)
            if cls.draw_line:
                # 遍历line_number次,就是画line_number根条线
                for x in range(0, cls.line_number):
                    cls.__gene_line(draw,width,height)
            #如果要回执噪点
            if cls.draw_point:
                cls.__gene_points(draw,10,width,height)
            return (text,image)

    第四步,创建view视图

    from utils.captcha.xfzcaptcha import Captcha
    from io import BytesIO
    def img_captcha(request):
        text,image = Captcha.gene_code()
        # BytesIO相当于一个管道,用来存储图片的流数据
        out = BytesIO()
        # 调用image的save方法,将照片存储到BytesIO中
        image.save(out, 'png')
        # 将BytesIO的文件指针移动到最开始位置
        out.seek(0)
        response = HttpResponse(content_type='image/png')
        # 从BytesIO的管道中,读取出图片数据,保存到response对象上
        response.write(out.read())
        response['Content-length'] = out.tell()
        return response

    第五步,创建url路由映射

    urlpatterns = [
        path('login/', views.login_view, name='login'),
        path('logout/', views.logout_view, name='logout'),
        path('img_captcha/',views.img_captcha, name='img_captcha'),
        path('register/',views.register, name='register')
    ]

    第六步,查看我们的登录页面显示的图片验证码

  • 相关阅读:
    java定时器
    存储过程
    set and get 使用方法
    getXxx setXxx入门理解
    oracle数据字典
    消息队列的两种模式
    Cookie/Session机制详解
    mysql千万级数据量根据索引优化查询速度
    window7下配置python2.7+tornado3.3开发环境
    priority queue优先队列初次使用
  • 原文地址:https://www.cnblogs.com/fengzi7314/p/12735506.html
Copyright © 2011-2022 走看看