基于Python+Flask实现一个简易网页验证码登录系统案例

news2025/1/12 12:12:41

在当今的互联网世界中,为了防止恶意访问,许多网站在登录和注册表单中都采用了验证码技术。验证码可以防止机器人自动提交表单,确保提交行为背后有一个真实的人类用户。
本文将向您展示如何使用Python的Flask框架来创建一个简单的验证码登录系统。

1. 开始之前

首先,确保你已经安装了以下所需的库:

pip install flask Pillow
  • Flask: 一个轻量级的Web服务器和框架。
  • Pillow: 处理图像操作,用于生成验证码图像。

2. 生成验证码图像

我们使用Pillow库来生成验证码图像。除了显示数字和字母,为了增加安全性,我们还会在图像上添加一些干扰线条和噪点。

from PIL import Image, ImageDraw, ImageFont
import random
import string

def generate_captcha_image():
    # 定义图片大小及背景颜色
    image = Image.new('RGB', (120, 30), color=(73, 109, 137))

    # 使用系统自带字体,或指定字体文件路径
    font_path = "./arial.ttf"
    fnt = ImageFont.truetype(font_path, 15)
    d = ImageDraw.Draw(image)

    # 生成5位数的验证码文本
    captcha_text = ''.join(random.choices(string.ascii_uppercase + string.digits, k=5))
    d.text((10, 10), captcha_text, font=fnt, fill=(255, 255, 0))

    # 添加干扰线条和噪点
    for _ in range(random.randint(3, 5)):
        start = (random.randint(0, image.width), random.randint(0, image.height))
        end = (random.randint(0, image.width), random.randint(0, image.height))
        d.line([start, end], fill=(random.randint(50, 200), random.randint(50, 200), random.randint(50, 200)))

    for _ in range(100):
        xy = (random.randrange(0, image.width), random.randrange(0, image.height))
        d.point(xy, fill=(random.randint(50, 200), random.randint(50, 200), random.randint(50, 200)))

    return image, captcha_text

3. 使用Flask建立Web应用

现在,我们使用Flask来创建一个Web应用,并展示登录页面与验证码图像。

from flask import Flask, render_template, jsonify, request, session
import io

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key_here'

@app.route('/')
def index():
    # 渲染登录页面
    return render_template('login.html')

@app.route('/captcha')
def captcha():
    # 使用上述函数生成验证码图片
    image, captcha_text = generate_captcha_image()

    # 将验证码文本存储到session,以便之后进行验证
    session['captcha'] = captcha_text

    buf = io.BytesIO()
    image.save(buf, format='PNG')
    buf.seek(0)
    return buf.getvalue(), 200, {
        'Content-Type': 'image/png',
        'Content-Length': str(len(buf.getvalue()))
    }

4. 处理登录请求

登录时,我们需要验证用户输入的验证码是否与我们生成的匹配。

@app.route('/login', methods=['POST'])
def login():
    # 检查用户输入的验证码是否与session中的一致
    if request.json.get('captcha', '').upper() == session.get('captcha', '').upper():
        return jsonify({'status': 'success', 'message': '登录成功'})
    else:
        return jsonify({'status': 'error', 'message': '验证码错误'}), 400

5. 演示视频+完整代码

演示视频如下,篇幅所限,如需完整代码,请打开地址免费获取:https://mp.weixin.qq.com/s/2fgjKvuuwaFvhYt5P68T1A

2023-09-11_113520

6. 总结

通过上面的代码,我们创建了一个简单的网站验证码登录系统。用户需要输入与图片上显示的验证码匹配的文本来验证自己是人类。这不仅提高了安全性,而且能够有效地阻止恶意机器人。
尽管此示例只是基础版本,但您可以在此基础上添加更多的安全性措施,例如使用更复杂的验证码、添加限制登录尝试次数的功能或使用其他验证方法。
希望本文能帮助您了解如何使用Python和Flask来创建验证码登录系统。在实际开发中,为了提供更好的用户体验和安全性,建议进一步完善和增强此系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1030260.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在线教育线上课堂知识付费源码 网络课堂在线课堂系统源码 含完整代码包和搭建教程

随着互联网技术的不断发展,在线教育逐渐成为了人们获取知识和技能的重要途径。线上课堂作为在线教育的一种具体实现方式,为广大学生提供了便捷、高效的学习平台。 分享一个在线教育线上课堂知识付费源码、网络课堂在线课堂系统源码,含完整搭…

数据分析的-五种常用方法实例

一、对照 俗称对比,单独看一个数据是不会有感觉的,必需跟另一个数据做对比才会有感觉。比如下面的图a和图b。 图a毫无感觉 图b经过跟昨天的成交量对比,就会发现,今天跟昨天实则差了一大截。 这是最基本的思路,也是最重…

数字图像处理中的击中与击不中运算(数字图像处理大题复习 P10)

文章目录 模板元 B 解析尝试覆盖得到结果 击中与击不中 可以看作就是 进阶版的腐蚀 模板元 B 解析 1 就是要求是 1 0 就是要求是 0 x 就是不管,随便是什么 尝试覆盖 如果我们选择一个地方覆盖,他符合这个模板即可 得到结果 这样我们就得到了击中与…

润和软件HopeStage与华宇信息TAS应用中间件完成产品兼容性互认证

近日,江苏润和软件股份有限公司(以下简称“润和软件”)HopeStage 操作系统与北京华宇信息技术有限公司(以下简称“华宇信息”)TAS应用中间件软件完成产品兼容性测试。 测试结果表明,企业级通用操作系统Hope…

如何批量为文件夹命名

如果你想要命名一些这样名字具有规律性的文件夹,当文件的数量增多,一个一个命名是非常耗费时间的。很容易想到,如果使用EXCEL,只需往下拉,就能很轻松的拉出1到5。那么,我们如何利用EXCEL来对文件夹进行快速…

高压配电安全监测系统:确保电力系统的稳定运行

随着现代社会对电力需求的不断增长,高压配电系统的重要性日益凸显。为了保证电力系统的稳定运行,提高供电质量,采用高压配电安全监测系统至关重要。 力安科技高压配电安全监测系统通过在每面高压柜(进线柜、出线柜、联络柜&#x…

K8S-存储卷,pv,pvc

一、emptyDir存储卷 1.概述 当Pod被分配给节点时,首先创建emptyDir卷,并且只要该Pod在该节点上运行,该卷就会存在。正如卷的名字所述,它最初是空的。Pod 中的容器可以读取和写入emptyDir卷中的相同文件,尽管该卷可以…

React useRequest解读

源码结构: 可以看到虽然是一个hooks(具有一定功能且具备状态的单一函数) 但是各种文件功能分得也是很细的,方便抽离和复用 useRequest.ts 抽离的原则还是单一功能原则 可以看出 真正的hooks实现是在Implement里 对于类型type的引…

(Clock Domain Crossing)跨时钟域信号的处理 (自我总结)

CummingsSNUG2008Boston_CDC.pdf 参考: 跨时钟域处理方法总结–最终详尽版 - love小酒窝 - 博客园 跨时钟域(CDC)设计方法之单bit信号篇(一) | 电子创新网赛灵思社区 孤独的单刀_Verilog语法,FPGA设计与调试,FPGA接口与…

关于ABB机器人的IO创建和设置

首先要链接网线,请求写权限 关于ABB机器人的默认地址位10有的是63.31看你硬接线 ABB机器人分配好信号机器人控制柜要重启 可以把机器人分配的信号导出为EIO 类似与发那科机器人IO

支付宝支付对接-附带完整代码!!

支付宝对接 文章目录 支付宝对接1、大纲1.1 整体业务流程图1.2、开发流程图1.3、核心参数1.4、支付宝开放平台1.5、支付应用场景1.6、支付宝入驻 2、环境准备2.1 首先注册自己的支付宝账号2.2 沙箱环境2.3 支持产品列表 3、项目实现3.1、项目代码地址3.2、 代码层级3.3、快速启…

【产品运营】如何提升B端产品的竞争力(上)

B端产品的核心竞争力不是只有产品功能丰富度、易用度这些维度,判断产品核心竞争力应该基于产品所定位解决的问题场景。 B端产品的成交因素很多,包括产品本身、公司品牌、客情关系、成功案例、产品定价、客户成熟度、需求匹配度等,本文只谈产品…

大数据(九):数据可视化(一)

专栏介绍 结合自身经验和内部资料总结的Python教程,每天3-5章,最短1个月就能全方位的完成Python的学习并进行实战开发,学完了定能成为大佬!加油吧!卷起来! 全部文章请访问专栏:《Python全栈教…

网站整站优化-网站整站优化工具

您是否曾为您的网站在搜索引擎中的排名而感到焦虑?是否苦苦思考如何提高流量、吸引更多用户? 什么是整站优化。简而言之,它是一项用于提升网站在搜索引擎中排名的策略和技巧。通过对网站的内容、结构、速度等方面进行优化,可以使…

Acer宏碁暗影骑士5笔记本AN517-54原装出厂Win10系统工厂模式

宏基电脑原厂WINDOWS10系统自带所有硬件的驱动、NITROSENSE风扇键盘控制中心、Office办公软件、出厂主题壁纸LOGO、 Acer Care Center、Quick Access等预装程序 链接:https://pan.baidu.com/s/1Ovui_CvsUaF-TX0NbuhEVg?pwdcrmv 提取码:crmv 所需要工…

第1讲:前后端分离思想

什么是前端 前端其实是个很大的范畴。 简单点说,针对浏览器的开发,浏览器呈现出来的页面就是前端。它的实质是前端代码在浏览器端被编译、运行、渲染。前端代码主要由三个部分构成:HTML(超文本标记语言)、CSS&#xf…

[CISCN 2019 初赛]Love Math 通过进制转换执行命令

目录 hex2bin bin2hex base_convert 动态函数 第一种解法 通过get获取参数 绕过 第二种解法 读取请求头 getallheaders echo a,b 第三种解法 异或获得更多字符 这道题也是很有意思! 通过规定白名单和黑名单 指定了 函数为数学函数 并且参数也只能是规…

角度回归——角度编码方式

文章目录 1.为什么研究角度的编码方式?1.1 角度本身具有周期性1.2 深度学习的损失函数因为角度本身的周期性,在周期性的点上可能产生很大的Loss,造成训练不稳定1.3 那么如何处理边界问题呢:(以θ的边界问题为例&#x…

Bartender for Mac菜单栏图标自定义

Bartender 是一款可以帮助用户更好地管理和组织菜单栏图标的 macOS 软件。它允许用户隐藏和重新排列菜单栏图标,从而减少混乱和杂乱。 以下是 Bartender 的主要特点: 菜单栏图标隐藏:Bartender 允许用户隐藏菜单栏图标,只在需要时…

【Vue3 源码讲解】nextTick

nextTick 是 Vue 3 中用于异步执行回调函数的函数&#xff0c;它会将回调函数延迟到下一个微任务队列中执行。其中&#xff0c;Vue 更新 DOM 是异步的。下面是对 nextTick 函数的详细解释&#xff1a; export function nextTick<T void, R void>(this: T,fn?: (this:…