用python实现一个简单的验证码

下面是用Python实现一个简单验证码的完整攻略。

简单验证码的实现

需要用到的第三方库

  • Pillow (Python Imaging Library)

假设我们要生成一个 4 位数字的验证码。

下面是完整的示例代码:

import random
from io import BytesIO

from PIL import Image, ImageDraw, ImageFont


def generate_verification_code(code_len=4, width=120, height=30, font_size=25):
    """
    生成验证码的函数
    :param code_len: 验证码的字符数
    :param width: 验证码图片的宽度
    :param height: 验证码图片的高度
    :param font_size: 验证码字体大小
    :return: (验证码字符串,验证码图片二进制数据)
    """
    # 生成随机的验证码字符串
    code = ''.join([str(random.randint(0, 9)) for _ in range(code_len)])
    # 创建画布
    im = Image.new('RGB', (width, height), (255, 255, 255))
    # 创建画笔
    draw = ImageDraw.Draw(im)
    # 创建字体对象
    font = ImageFont.truetype('arial.ttf', font_size)
    # 计算字符大小和位置
    font_width, font_height = font.getsize(code[0])
    x = (width - code_len * font_width) // 2
    y = (height - font_height) // 2
    # 画字符
    for i in range(code_len):
        c = code[i]
        draw.text((x + font_width * i, y), c, (0, 0, 0), font)
    # 画干扰线
    for i in range(random.randint(1, 3)):
        x1 = random.randint(0, width)
        y1 = random.randint(0, height)
        x2 = random.randint(0, width)
        y2 = random.randint(0, height)
        draw.line((x1, y1, x2, y2), fill=(0, 0, 0))
    # 画干扰点
    for i in range(random.randint(100, 150)):
        draw.point((random.randint(0, width), random.randint(0, height)), fill=(0, 0, 0))
    # 生成验证码图片二进制数据
    f = BytesIO()
    im.save(f, 'png')
    f.seek(0)
    return code, f.read()

该函数的使用方法如下:

code, data = generate_verification_code()

# ... 将 data 发送给前端 ...

示例1

在 Django 中使用该函数实现一个简单的验证码视图:

from django.http import HttpResponse


def captcha_view(request):
    # 生成验证码
    code, data = generate_verification_code()
    # 设置响应头
    response = HttpResponse(data, content_type='image/png')
    response['Content-Length'] = len(data)
    # 将验证码字符串保存到 session 中
    request.session['captcha'] = code
    # 返回 HttpResponse 对象
    return response

在模板中使用此视图的方式如下:

<img src="{% url 'captcha_view' %}" alt="captcha">
<input type="text" name="captcha">

示例2

在 Flask 中使用该函数实现一个简单的验证码视图:

from flask import Flask, Response, session

app = Flask(__name__)
app.secret_key = 'your_secret_key'


@app.route('/captcha')
def captcha_view():
    # 生成验证码
    code, data = generate_verification_code()
    # 将验证码字符串保存到 session 中
    session['captcha'] = code
    # 返回 Response 对象
    return Response(data, content_type='image/png')


if __name__ == '__main__':
    app.run()

在模板中使用此视图的方式如下:

<img src="{{ url_for('captcha_view') }}" alt="captcha">
<input type="text" name="captcha">

以上就是一个简单验证码的完整实现过程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:用python实现一个简单的验证码 - Python技术站

(1)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Python学习之文件的创建与写入详解

    Python学习之文件的创建与写入详解 在Python中,文件是信息存储的一种重要方式。Python中的文件操作非常简单,可以轻松地创建、读取和修改文件。本文介绍如何在Python中创建和写入文件。 文件的创建 要在Python中创建一个新文件,可以使用内置的open()函数。 open()函数的语法如下: file = open(filename, mod…

    python 2023年6月2日
    00
  • python 服务器运行代码报错ModuleNotFoundError的解决办法

    当我们在Python服务器运行代码时,有时会遇到ModuleNotFoundError的报错。这通常是由于Python环境配置不正确、Python库缺失或路径不正确等原因引起的。以下是一常见的Module报错的解决方案: 1. 安装缺失的Python库 如果在Python服务器运行代码时遇到了类似以下的报错: ModuleNotFoundError: No …

    python 2023年5月13日
    00
  • Python办公自动化Word转Excel文件批量处理

    下面是“Python办公自动化Word转Excel文件批量处理”的完整实例教程: 一、背景介绍 在日常工作中,我们经常需要对各种文件进行处理,其中涉及到文件格式转换、批量处理等操作。而Python作为一种流行的编程语言,可以帮助我们实现这些自动化操作。 本文将介绍如何使用Python对Word文件进行批量转换为Excel文件的操作。 二、实现步骤 1.准备工…

    python 2023年5月14日
    00
  • Python中SOAP项目的介绍及其在web开发中的应用

    Python中SOAP项目的介绍及其在web开发中的应用 SOAP(Simple Object Access Protocol)是一种基于XML的协议,用于交换数据以及进行远程过程调用(RPC)。SOAP使用HTTP,SMTP,FTP等协议作为传输协议,可以在不同的操作系统和编程语言之间进行通信。 在Python中,有多个第三方库支持SOAP协议,例如sud…

    python 2023年6月3日
    00
  • 如何使用Python获取MySQL中的表的列数?

    要使用Python获取MySQL中的表的列数,可以使用Python的内置模块sqlite3或第三方库mysql-connector-python。以下是使用mysql-connector-python在MySQL中获取表的列数的完整攻略: 连接 要连接到MySQL,需要提供MySQL的主机、用户名、和密码。可以使用以下代码连接: mysql.connecto…

    python 2023年5月12日
    00
  • 如何在Python中将字符串转换为集合

    当我们需要在Python中处理一系列独立而又不重复的元素时,集合就是一个很好用的数据类型。但很多时候我们需要从其他数据类型中将数据转换成集合,下面就讲解一下如何在Python中将字符串转换成集合。 1. 使用split方法 最简单的方法是使用split方法,它可以将字符串分割成一个列表,然后利用set函数将列表转换为集合。示例代码如下: string = &…

    python 2023年5月13日
    00
  • Python中else怎么用?else的用法总结

    下面是关于Python中else的用法及示例解释。 一、Python中if-else语句 在Python中,if-else语句是用于控制流程的语句,它根据条件判断来执行不同的代码块。它的语法结构如下: if condition: # 表达式为真时执行的代码块 else: # 表达式为假时执行的代码块 其中,condition表示一个条件表达式,如果它的结果为…

    python 2023年6月5日
    00
  • Python实现图像的二进制与base64互转

    图像的二进制与base64互转 在Python中,我们可以使用base64模块来进行二进制与base64之间的转换。具体实现过程如下: 将二进制转为base64编码: import base64 # 二进制图片文件名 image_filename = ‘example.png’ # 读取二进制文件数据 with open(image_filename, ‘r…

    python 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部