Django自学笔记之验证码生成及使用验证

版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/z564359805/article/details/89919870

views.py中: 

from django.shortcuts import render
from django.http import HttpResponse

# 验证码
def verifycode(request):
    # 引入绘图模块
    from PIL import Image, ImageDraw, ImageFont
    import random
    # 定义变量,用于画面的背景色、宽、高
    bgcolor = (random.randrange(20,100),random.randrange(20, 100), 255)
    width = 100
    height = 25
    # 创建画布对象
    im = Image.new('RGB',(width,height),bgcolor)
    # 创建画笔对象
    draw = ImageDraw.Draw(im)
    # 调用画笔的point()函数绘制噪点
    for i in range(0, 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)
    # 定义验证码备选值
    str1 = 'ABCD123EFGHIJK456LMNOPQRS789TUVWXYZ0'
    # 随机选取四个值作为验证码
    rand_str = ''
    for i in range(0,4):
        rand_str += str1[random.randrange(0,len(str1))]
    # 打印出随机的值
    # print(rand_str)
    # 构造字体对象
    font = ImageFont.truetype('./static/font/msyh.ttf',20)
    # 构造字体颜色
    fontcolor = (255,random.randrange(0,255),random.randrange(0,255))
    # 创建文本,第一个值
    draw.text((10, -2), rand_str[0], font=font, fill=fontcolor)
    # 创建文本,后面三个值
    for k in range(1,4):
        draw.text((k*25,-2),rand_str[k],font=font,fill=fontcolor)
    # draw.text((25,-3),rand_str[1],font=font,fill=fontcolor)
    # draw.text((50,-3),rand_str[2],font=font,fill=fontcolor)
    # draw.text((75,-3),rand_str[3],font=font,fill=fontcolor)
    # 释放画笔
    del draw
    # 存入session,用于做进一步验证
    request.session['verifycode'] = rand_str
    # 内存文件操作
    from io import BytesIO
    buf = BytesIO()
    # 将图片保存在内存中,文件类型为png
    im.save(buf,'png')
    # 将内存中的图片数据返回给客户端,MIME类型为图片png
    return HttpResponse(buf.getvalue(),'image/png')

# 验证码输入
def verifyTest1(request):
    return render(request,'verifyTest1.html')

# 返回验证结果,成功显示ok,失败显示no
def verifyTest2(request):
    code1 = request.POST['code1']
    code2 = request.session['verifycode']
    if code1.upper() == code2: # 不区分大小写
        return HttpResponse('ok')
    else:
        return HttpResponse('no')

templates新建verifyTest1.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>验证码测试</title>
</head>
<body>
<form action="/verifyTest2/" method="post">
    {% csrf_token %}
    <input type="text" name="code1">
    <img id='verifycode' src="/verifycode/" alt="验证码">
    <input type="submit" value="提交">
</form>


</body>
</html>

配置url,应用名为booktest:

from django.urls import path
from booktest import views

urlpatterns = [
    path('verifycode/',views.verifycode),
    path('verifyTest1/',views.verifyTest1),
    path('verifyTest2/',views.verifyTest2),
]

启动服务:

python manage.py runserver

打开网址:http://127.0.0.1:8000/verifyTest1/

猜你喜欢

转载自blog.csdn.net/z564359805/article/details/89919870
今日推荐