一、验证码的用途
在用户注册、登录页面,为了防止暴力请求,可以加入验证码的功能,如果验证码错误,怎不需要任何处理,可以减轻业务服务器、数据库服务的压力。
二、手动实现验证码功能
1.安装Pillow
pip install Pillow
这里可以查看
PIL模块API
,以下代码用到了Image,ImageDraw,ImageFont对象及方法
2. 在应用视图中,创建视图verify_code
1)随机生成字符串后存入session中,用于后续做出判断
2)视图中返回mime-type为image/png
3.代码实践
1)视图代码:
# 手绘验证码
from PIL import Image, ImageDraw, ImageFont
from django.utils.six import BytesIO
import random
def verify_code(request):
#定义变量 用于画面的背景颜色 、宽、 高
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 = 'ABCDEFGHIJKLMNOPQRSTUVXYZ0123456789'
# 随机选取4个值作为验证码
rand_str = ''
for i in range(0 ,4):
rand_str += str1[random.randrange(0, len(str1))]
# 构造字体对象 字体对象的路径:
font = ImageFont.truetype('ebrima.ttf', 23)
# 构造字体的颜色
fontcolor = (255, random.randrange(0, 255), random.randrange(0,255))
# 绘制4个字
draw.text((5, -3), rand_str[0], 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
request.session['verifycode'] = rand_str
# 内存文件操作
buf = BytesIO()
# 将图片保存在内存中 文件类型:png
im.save(buf, 'png')
# 将内存中的图片数据返回给客户端 MIME类型为图片png
return HttpResponse(buf.getvalue(),'image/png')
2)url配置代码
path('verify_code/',views.verify_code), # 验证码
3)登录页面中HTML代码
验证码:<input type="text" name="vcode"><img src="/verify_code/"><br/>
4)登录视图中的判断验证码的对错
首先判断验证码的是否正确,如果错误也直接重定向到登录页面,如果正确则添加密码的判断以及登录后的操作(此处省略)
def login_chick(request):
# 用户输入的
vcode1 = request.POST.get('vcode')
# 电脑保存的
vcode2 = request.session['verifycode']
if not vcode1 == vcode2:
return redirect('/login/')
"""此处省略这里添加密码对错的判断以及登录后做的内容"""
三、启动服务器验证:
版权声明:本文为weixin_43844838原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。