最常见验证码的实现--python源码分享

2020-10-24 admin (122) (0) python开发>django
  

版权申明

1.本站部分文章收集于互联网,不承担任何责任和版权问题。

2.若有侵权内容、不妥之处,请联系我们确认后立即删除。

3.本站文章仅供学习研究用途,请勿用于商业目的。

4.联系邮箱 pysnake@qq.com

详情介绍

最常见的就是数字加字母的验证码

另外还有带算法的,左右滑动的,按要求找图或者找字的,按顺序画图的

先说数字加字母的验证码吧

这个也是一个地址请求之后返回的结果显示出来

前端:

<div class="col-sm-10">

                            <div style="float:left;"><input type="text" class="form-control" id="safecode" name="safecode"  style="width:65px;" data-bv-field="safecode" maxlength="4"></div>

                            <div style="float:left; padding-left:5px;"><img src="/getVerifyCode/" alt="" id="safecodeimg"></div>

                            <div style="float:left; height:35px; line-height:35px;cursor:pointer;" ><span id="changecode">换一张</span></div>

                        </div>

js事件:

$("#changecode").bind("click",function(){

$("#safecodeimg").attr("src",$("#safecodeimg").attr("src")+Math.random());

});

 

【后端】:

请求地址:

url(r"^getVerifyCode/",views.getVerifyCode,name="getVerifyCode")

视图:

#获取随机颜色

def get_random_color():

    R=random.randrange(255)

    G=random.randrange(255)

    B=random.randrange(255)

    return(R,G,B)

 

#验证码视图

def getVerifyCode(request):

    bg_color=(245,245,245) # 定义画布背景

    img_size=(90,34) # 定义画布大小

    image=Image.new("RGB",img_size,bg_color) # 定义画布

    draw=ImageDraw.Draw(image,"RGB") # 定义画笔

    # 创建字体(字体的路径,服务器路径)

    font_path = 'D:/eclipse/works/bbspro/bbspro/src/static/fonts/AdobeArabic-2.ttf'

    # 实例化字体,设置大小是30

    font = ImageFont.truetype(font_path, 30)

    # 准备画布上的字符集

    source = "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789"

    # 保存每次随机出来的字符

    code_str = ""

    for i in range(4):

        # 获取数字随机颜色

        text_color = get_random_color()

        # 获取随机数字 len

        tmp_num = random.randrange(len(source))

        # 获取随机字符 画布上的字符集

        random_str = source[tmp_num]

        # 将每次随机的字符保存(遍历) 随机四次

        code_str += random_str

        # 将字符画到画布上

        draw.text((5 + 20*i, -2), random_str, text_color, font)

    #噪点干扰线

    width=90

    height=34

    for i in range(10):

        x1=random.randint(0,width)

        x2=random.randint(0,width)

        y1=random.randint(0,height)

        y2=random.randint(0,height)

        draw.line((x1,x2,y1,y2),fill=get_random_color())

    

    for i in range(10):

        draw.point([random.randint(0,width),random.randint(0,height)], fill=get_random_color())

        x=random.randint(0,width)

        y=random.randint(0,height)

        draw.arc((x,y,x+4,y+4),0,90,fill=get_random_color())

 

    # 记录给哪个请求发了什么验证码

    request.session['code'] = code_str

 

    # 获得一个缓存区

    buf = io.BytesIO()

    # 将图片保存到缓存区

    image.save(buf, 'png')

    # 将缓存区的内容返回给前端 .getvalue 是把缓存区的所有数据读取

    return HttpResponse(buf.getvalue(), 'image/png')

源码直接套用就行了。


需要登录后才可回复

共有0条留言