下面是关于 Python 图片验证码代码的完整攻略及两条示例说明:
什么是图片验证码
图片验证码是用于验证用户身份的一种常用方式。一般情况下,在需要用户登录的网站或系统中,输入用户名和密码之后,会提示输入验证码。用户需要通过输入验证码来证明自己是人类而非机器人或恶意程序,以保证账号的安全性。
图片验证码通常都是由随机生成的一些字符串和图像噪点构成的,可以防止机器人对网站进行恶意攻击。
使用 Python 生成图片验证码
在 Python 中,我们可以安装 Pillow 或者其他图片处理库来生成图片验证码。以下是一个示例代码:
from PIL import Image, ImageFont, ImageDraw
import random
# 定义生成随机字符的函数
def get_random_char():
# 字符范围
char_range = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
# 随机选择字符
char = random.choice(char_range)
return char
# 定义生成干扰点的函数
def get_random_point(width, height, num):
# 初始化画布
img = Image.new('RGB', (width, height), (255, 255, 255))
# 获取一支画笔
draw = ImageDraw.Draw(img)
# 生成干扰点
for i in range(num):
x = random.randint(0, width)
y = random.randint(0, height)
draw.point((x, y), fill=(0, 0, 0))
return img
# 定义生成验证码图片的函数
def get_verify_code(width, height, num):
# 初始化画布
img = Image.new('RGB', (width, height), (255, 255, 255))
# 获取一支画笔
draw = ImageDraw.Draw(img)
# 绘制验证码
code = ''
for i in range(num):
char = get_random_char()
code += char
x = i * (width // num) + random.randint(0, 10)
y = random.randint(0, height // 3)
draw.text((x, y), char, font=ImageFont.truetype('arial.ttf', 25), fill=(0, 0, 0))
# 绘制干扰点
point_img = get_random_point(width, height, 100)
img.paste(point_img, (0, 0))
# 返回验证码和图片对象
return code, img
# 生成并显示验证码图片
code, img = get_verify_code(120, 50, 4)
img.show()
这个示例代码包括三个函数:
get_random_char
,用于生成随机字符串。get_random_point
,用于生成随机干扰点。get_verify_code
,用于生成验证码图片并返回验证码和图片对象。
运行这个代码,可以在屏幕上看到一个随机的验证码图片。
在 Django 中使用图片验证码
在 Django 中,我们可以直接使用 get_verify_code
函数生成验证码图片,并在模板中显示。
以下是一个 Django 视图函数的示例代码:
from django.shortcuts import render
from django.http import HttpResponse
from . import forms
from PIL import Image, ImageFont, ImageDraw
import random
# 定义生成随机字符的函数
def get_random_char():
# 字符范围
char_range = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
# 随机选择字符
char = random.choice(char_range)
return char
# 定义生成干扰点的函数
def get_random_point(width, height, num):
# 初始化画布
img = Image.new('RGB', (width, height), (255, 255, 255))
# 获取一支画笔
draw = ImageDraw.Draw(img)
# 生成干扰点
for i in range(num):
x = random.randint(0, width)
y = random.randint(0, height)
draw.point((x, y), fill=(0, 0, 0))
return img
# 定义生成验证码图片的函数
def get_verify_code(width, height, num):
# 初始化画布
img = Image.new('RGB', (width, height), (255, 255, 255))
# 获取一支画笔
draw = ImageDraw.Draw(img)
# 绘制验证码
code = ''
for i in range(num):
char = get_random_char()
code += char
x = i * (width // num) + random.randint(0, 10)
y = random.randint(0, height // 3)
draw.text((x, y), char, font=ImageFont.truetype('arial.ttf', 25), fill=(0, 0, 0))
# 绘制干扰点
point_img = get_random_point(width, height, 100)
img.paste(point_img, (0, 0))
# 返回验证码和图片对象
return code, img
def login(request):
# 如果是 GET 请求,显示登录表单
if request.method == 'GET':
login_form = forms.LoginForm()
# 获取验证码图片
code, img = get_verify_code(120, 50, 4)
# 将验证码存储到 session 中,方便验证
request.session['verify_code'] = code
img_buffer = BytesIO()
img.save(img_buffer, format='JPEG')
img_data = img_buffer.getvalue()
return render(request, 'login.html', {'form': login_form, 'img_data': base64.b64encode(img_data).decode()})
# 如果是 POST 请求,处理登录表单
else:
# 获取表单数据
username = request.POST.get('username')
password = request.POST.get('password')
verify_code = request.POST.get('verify_code')
# 验证验证码
if verify_code != request.session['verify_code']:
# 验证码错误,重新显示表单
login_form = forms.LoginForm()
code, img = get_verify_code(120, 50, 4)
request.session['verify_code'] = code
img_buffer = BytesIO()
img.save(img_buffer, format='JPEG')
img_data = img_buffer.getvalue()
return render(request, 'login.html', {'form': login_form, 'img_data': base64.b64encode(img_data).decode(), 'message': '验证码错误'})
# 验证通过,处理登录逻辑
# ...
这个示例代码中包括一个 login
视图函数,用于处理用户登录。如果是 GET 请求,将会先显示一个包含验证码图片的登录表单;如果是 POST 请求,将会先验证验证码,然后进行登录逻辑处理。
总结
本文介绍了使用 Python 生成图片验证码的方法,并提供了两个示例代码。第一个示例代码是使用 Pillow 库生成验证码图片;第二个示例代码是在 Django 中使用图片验证码。通过学习这些代码,我们可以简单地了解 Python 中的图片处理,以及如何在网站中使用图片验证码来保证用户账户安全。