django 验证码实现

Posted 睡觉的阿狸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django 验证码实现相关的知识,希望对你有一定的参考价值。

django验证码的使用:

验证码的作用:用于人机识别。

验证码

###验证码:
def code_str(request):
    from PIL import Image
    from  PIL import ImageDraw,ImageFont
    from io import BytesIO

    #生成随机字符串,一个数组的形式
    import random
    def get_random_color():
        return (random.randint(0,255),random.randint(0,255),random.randint(0,255))

    ##图片颜色,RGB模式,(220,36)是尺寸,color是颜色,需要输入上方的三个随机数字
    image=Image.new("RGB",(220,36),color=get_random_color())
    draw =ImageDraw.Draw(image)
    # 图片字体的样式,大小
    font = ImageFont.truetype("static/font/kumo.ttf",size=32)
    # !!!!!!/static/font/kumo.ttf",不好使,不能在开头加"/"

    #图片中的字,先生成随机的字符串,用chr把数组转化为对应的字符
    random_str=""
    for i  in  range(5):
        num=str(random.randint(0,9))
        up=chr(random.randint(97,122))
        down=chr(random.randint(65,90))
        res=random.choice([num,up,down])
        #font对应上方的font对象,()中的数字代表每个字符的间距,起始位置。
        #  xy = xy[0] + offset[0], xy[1] + offset[1](这个是源码中的标识,text中的第一位)
        draw.text((20 + i * 30, 0), res, get_random_color(), font=font)
        random_str+=res
        #  xy = xy[0] + offset[0], xy[1] + offset[1]

    print(random_str)
    print("wwwwwwwwwwwwww",random_str)
    #这里,因为每个人的验证码不能一样,而且需要保存,所以可以用session来进行保存,
    #相当于每个人一个仓库,之后登陆之后去session中去取,来验证.
    request.session["code_str"]=random_str
    #这里将生成的图片以二进制的方式读取到内存.而后将二进制文件
    f = BytesIO()
    image.save(f,"png") #png是格式
    data = f.getvalue() #取到二进制值

    print(data)#打印出来的是下方的格式.
    #b‘\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xdc\x00\x00\x0......

    #html中的代码,调用这个函数,返回的是图片的二进制码的形式,转化为图片。
    # < img    width = "250"    height = "36"    src = "/code_str/"    alt = ""    class ="valid_img" >
    return HttpResponse(data)

校验验证码:如果验证码不对,不需要校验用户名,密码等。

#登陆函数
def login(request):
    ###先校验验证码
    if request.is_ajax():
        user=request.POST.get("user")
        pwd=request.POST.get("pwd")
        #取到用户输入的验证码
        code_str=request.POST.get("code_str")
        print("666666666666",code_str)

        print(request.POST)
        res={}
        #取到后台生成的验证码
        random_str=request.session.get("code_str")
        print(666666666,random_str)
        if str(code_str).upper()==random_str.upper():
            print("77777777777777")
            #如果验证码正确进行验证
            from django.contrib import auth
            user=auth.authenticate(username=user,password=pwd)
            if user:
                res["user"]=user.username
            else:
                res["msg"]="用户名或者密码错误"
        else:
            res["msg"]=验证码错误
        print("sssssssssssssssss",res)

        return HttpResponse(json.dumps(res))
    return render(request,"login.html",locals())

在login.html中添加更换验证码功能,点击图片,更换验证码。

{#  点击验证码换字符  #}
    $(".valid_img").click(function () {
        {#取到你点击的对象,然后刷新src属性#}
        $(this)[0].src+="?"

    })

 

以上是关于django 验证码实现的主要内容,如果未能解决你的问题,请参考以下文章

django 验证码实现

Django实现图片验证码

Django实现验证码

Django之路 - 实现登录随机验证码

64.django实现登录添加验证码功能

Django实现验证码