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