验证码的生成和验证

1:定义生成验证码的函数
2:配置url路径
3:调用
4:看不清换一张的实现
5:验证输入是否正确

1:定义生成验证码的函数

"""
# code is far away from bugs with the god animal protecting
    I love animals. They taste delicious.
              ┏┓      ┏┓
            ┏┛┻━━━┛┻┓
            ┃      ☃      ┃
            ┃  ┳┛  ┗┳  ┃
            ┃      ┻      ┃
            ┗━┓      ┏━┛
                ┃      ┗━━━┓
                ┃  神兽保佑    ┣┓
                ┃ 永无BUG!   ┏┛
                ┗┓┓┏━┳┓┏┛
                  ┃┫┫  ┃┫┫
                  ┗┻┛  ┗┻┛
"""
from django.http import  HttpResponse
from PIL import Image,ImageDraw,ImageFont
import random
import io


# create your views here
def verify(request):
    # 1 定义变量, 用于画面的背景色,宽,高
    bg_color = (random.randrange(20, 100), random.randrange(20,1000),255)
    # 随机生成颜色
    width = 100
    height = 25
    # 2 创建画面对象
    im = Image.new("RGB", (width, height), bg_color)
    # 3创建画笔对象
    draw = ImageDraw.Draw(im)
    # 4调用画笔的point()函数绘制噪点
    for i in range(100):
        xy = (random.randrange(0,width), random.randrange(0,height))
        fill = (random.randrange(0,255),255,random.randrange(0,255))
        draw.point(xy,fill=fill)

    # 5定义验证码的备选值
    str1 = "ABCD1234EFGHJK9087LOIUYFCVVB2346"
    # 6随机选取4个值作为验证码
    rand_str = ""
    for i in range(4):
        rand_str = rand_str + str1[random.randrange(0, len(str1)-1)]
    print(rand_str)
    # 7构造字体对象 这个字体要是系统中有的,否则会报错
    font = ImageFont.truetype('Arvo-Regular.ttf', 23)
    # 构造字体颜色
    fontcolor = (255, random.randrange(0, 255), random.randrange(0, 255))
    # 8绘制四个字
    draw.text((5, 2), rand_str[0], font=font, fill=fontcolor)

    draw.text((25, 2), rand_str[1], font=font, fill=fontcolor)

    draw.text((50, 2), rand_str[2], font=font, fill=fontcolor)

    draw.text((75, 2), rand_str[3], font=font, fill=fontcolor)

    # 9释放画笔
    del draw
    # 10存入session, 用于做进一步验证
    request.session['verifycode'] = rand_str
    print(request.session.get('verifycode'))
    # 11将图片保存在内存中,文件类型为png
    f = io.BytesIO()

    im.save(f, 'png')
    # 12将内存中的图片数据返回给客户端,MIME类型为图片png
    return HttpResponse(f.getvalue(), 'image/png')


2:配置url路径

    url(r"^img/$", viewsUtil.verify), 显示验证码的路径
    url(r'^verifycodeValid/$', views.verifycodeValid, name="verifycodeValid"),# 验证验证码是否正确的路径

3:调用

    
CheckCode 看不清,换一个

4:看不清换一张的实现

上面的表单路径后面带有参数为了进行验证码刷新

# js代码
 

 

说明:

$('#verifycode').attr('src',$('#verifycode').attr('src')+1)

点击后,点击后就变成了"/verifycode/?1 1",继续点就会变成"/verifycode/?1 11"…

?1 是没有实际意义的,它唯一的作用是向浏览器表明: 图片链接发生了变化,图片需要刷新.

5:验证输入是否正确

#验证函数
def verifycodeValid(request):
    vc = request.POST["vc"]
    if vc.upper() == request.session["verifycode"]:
        return redirect("/pianke/login_handle/")
    else:
        return redirect("/pianke/login/")

好了,这样就大功告成了

上面这个验证验证码的代码是错误的方式,因为如果重定向了就没办法从前台表单带回数据了

改正后的版本:用handle函数调用验证码验证函数

def login_handle(request):

    vc = request.POST["vc"]
    if verifycodeValid(request, vc):
        username = request.POST["username"]
        password = request.POST["password"]
        try:
            u = User.objects.get(username = username) # 第一个username时model中 的 第二个时上面获取到的 这句话是查询username=上面username的对象
            if u.password == password: # 匹配上面的password是否与这个对象的password相等
                request.session["username"]=username # 如果相等的话就存到数据库里

        except Exception as e: # 因为可能username 不在数据库里查询不到所以可能会抛出异常
            print(e)
        finally:
               # return render(request, "pianke/index.html")
               return redirect("/pianke/logined_index/")
    else:
        return redirect("/pianke/login/")
#
# def verify_page(request):
#     verify(request)
#     template = loader.get_template("pianke/login.html")
#     return HttpResponse(template.render())


def verifycodeValid(request,vc):
    if vc.upper() == request.session["verifycode"]:

        return True
    else:
        return False

你可能感兴趣的:(验证码的生成和验证)