python 图片验证码代码

  • Post category:Python

下面是关于 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()

这个示例代码包括三个函数:

  1. get_random_char,用于生成随机字符串。
  2. get_random_point,用于生成随机干扰点。
  3. 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 中的图片处理,以及如何在网站中使用图片验证码来保证用户账户安全。