验证码

第一步,下载Pillow

第二步,在你所创建的应用中创建一个utils.py文件,里边内容如下

# 验证码
import random, string
from PIL import Image, ImageDraw, ImageFont, ImageFilter


def getRandomChar(count=4):
    # 生成随机字符串
    # string 模块包含各种字符串,以下为小写字母加数字
    ran = string.ascii_lowercase + string.digits
    char = ''
    for i in range(count):
        char += random.choice(ran)
    return char


# 返回一个随机的 RGB 颜色
def getRandomColor():
    return (random.randint(50, 150), random.randint(50, 150), random.randint(50, 150))

def create_code():
    # 创建图片,模式,大小,背景色
    img = Image.new('RGB', (120, 30), (255, 255, 255))
    # 创建画布
    draw = ImageDraw.Draw(img)
    # 设置字体
    font = ImageFont.truetype('arial.ttf', 25)

    code = getRandomChar()
    # 将生成的字符画在画布上
    for t in range(4):
        draw.text((30 * t + 5, 0), code[t], getRandomColor(), font)
    # 生成干扰点
    for _ in range(random.randint(0, 50)):
    # 位置,颜色
        draw.point((random.randint(0, 120),
                random.randint(0, 30)), fill=getRandomColor())
    # 使用模糊滤镜使图片模糊
    # img = img.filter(ImageFilter.BLUR)
    # 保存
    # img.save(''.join(code)+'.jpg','jpeg')
    return img, code


#     print(img,code)
# create_code()

第三部,在models.py中添加下边的内容

from django.http import HttpResponse
from io import BytesIO
from . import forms
from . import models
from . import utils
def create_code_img(request):
 	# 在内存中开辟空间用以生成临时的图片
 	f = BytesIO()
 	img, code = utils.create_code()
 	# 保存验证码信息到 session 中,方便下次表单提交时进行验证操作
 	request.session['check_code'] = code
 	img.save(f, 'PNG')
 	return HttpResponse(f.getvalue())

第四步,在页面上的使用方法

……
<p>
 验证码:
<input type="text" name="code" id="code">
<img src="/formtest/code/" alt="" onclick="refresh_check_code(this)">
</p>
……
<script>
 function refresh_check_code(node) {
 // src 后面加问号会自动刷新验证码 img 的 src
// get 请求方式缓存处理
 node.src = '/formtest/code/?search=' + Math.random();
 }
</script>

注意,在有验证码提交的表单中,我们需要先验证验证码是否 正确,只有正确的情况下,才继续其他操作(这样当验证码错 误的时候,就不要查询数据库了,减少对数据库的操作),否则直接返回到原页面,显示验证码输入有误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值