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

2023-11-11

在当今的互联网世界中,为了防止恶意访问,许多网站在登录和注册表单中都采用了验证码技术。验证码可以防止机器人自动提交表单,确保提交行为背后有一个真实的人类用户。
本文将向您展示如何使用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来创建验证码登录系统。在实际开发中,为了提供更好的用户体验和安全性,建议进一步完善和增强此系统。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • cocos2d-x中有一个JniHelper类详细使用

    主体思路 通过JNI获取java虚拟机 再获取当前程序的JNI环境 通过JNI环境获取需要调用的java类信息 再获取需要调用的java类中的函数信息 再通过JNI环境调用 使用类信息 函数信息 调用对应的java函数 看起来好像有点复杂
  • Selenium之下拉框操作详解

    前言 执行自动化测试过程中遇到下拉框 包含 单选 多选 如何定位到下拉框并选中某个选项 1 下拉框的分类 select 标签 非 select 标签 2 Select 下拉列表处理 针对 select 标签的下拉列表 Selenium 提供
  • CCObject的分析:release retain基于2.2.3 增加3.2ref对比

    CCSprite fish new CCSprite 02 CCLOG After new d fish gt retainCount 03 fish gt init 04 CCLOG After init d fish gt retain
  • 图像的视网膜变换研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 图像的视网膜变换是受到人眼启发的一种技术
  • Spring Native实战(畅快体验79毫秒启动springboot应用)

    应用启动速度不超过100毫秒 启动即达到性能峰值 C1 C2等手段已经用不上了 运行时更低的内存消耗 docker镜像不含JDK 所需文件已经抽取出来放入镜像 官方展示的含有Spring Boot Spring MVC Jackson To
  • 面试时不要有谦卑的态度

    今天在B站看了几个Java面试的实战视频 然后茶余饭后产生了一些思考 在找工作过程中 虽然我们跟企业不是平等的 但起码是双向选择 你只需要以下三个问题即可 你可以谦虚但不可以谦卑 谦卑往往意味着你潜意识里想偷懒 不想学那么多 思考那么多就可
  • 虚拟机黑屏虚拟机繁忙的解决方法

    问题描述 不知是因为VMware版本的问题还是其他原因 有时候虚拟机很长时间不能正常开机 整个屏幕都是黑的 想关掉VM都关不了 提示 虚拟机繁忙 解决方法 呼出任务管理器强制结束VM的进程 然后再次打开VM 会出现以下的提示 而且之前出问题
  • c++ 编写杨辉三角(详细注释)

    include
  • PHP表单的创建和使用

    用户注册
  • 应用实践

    导读 蜀海供应链是集销售 研发 采购 生产 品保 仓储 运输 信息 金融为一体的餐饮供应链服务企业 因其业务比较复杂 2020 年底完成了以 Apache Doris 为核心的架构升级 并在 2021 年开始建设以 Apache Doris
  • 梯度下降算法总结

    基本梯度下降法 随机梯度下降 批梯度下降法 Momentum梯度下降法 Nesterov Momentum梯度下降法 AdaGrad RMSprop AdaDelta Adam 机器学习中 求解的问题常常变为最优化问题 求解最优化问题 常常
  • Scrum中的产品需求预审

    原文作者 Mike Cohn 为了保持产品待办事项 product backlog 的整洁有序 我们需要召开product backlog refinement会议 有时也叫product backlog grooming 这个会议是在一个
  • 悲观锁synchronized、乐观锁CAS

    1 悲观锁 乐观锁 悲观锁是一种思想 在多线程竞争下 加锁 释放锁会导致比较多的上下文切换和调度延时 引起性能问题 一个线程持有锁会导致其它所有需要此锁的线程挂起 如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置 引起性能
  • 高合汽车旗下可进化超跑SUV高合HiPhi X亮相海口国际新能源车展

    2021年1月8日 高端新能源智能出行品牌高合汽车旗下高合HiPhi X亮相第三届海口国际新能源汽车展览会 华人运通高合汽车创始人丁磊在现场透露 上市至今高合HiPhi X限量3000辆创始版车型即将预订售罄 累计收获了32000多位留资用
  • 【广州华锐互动】AR远程巡检系统在设备维修保养中的作用

    随着科技的不断发展 AR 增强现实 远程巡检系统在设备检修中发挥着越来越重要的作用 这种系统可以将AR技术与远程通信技术相结合 实现对设备检修过程的实时监控和远程指导 提高设备检修的效率和质量 首先 AR远程巡检系统可以帮助检修人员更好地理
  • NodeJs应用场景【学习路线图】

    Nodejs学习路线图 从零开始nodejs系列文章 将介绍如何利Javascript做为服务端脚本 通过Nodejs框架web开发 Nodejs框架是基于V8的引擎 是目前速度最快的Javascript引擎 chrome浏览器就基于V8
  • 【LeetCode-Java】155. Min Stack

    1 原题 链接 https leetcode com problems min stack Design a stack that supports push pop top and retrieving the minimum eleme
  • 史上最全STL常用容器及其底层存储结构总结

    各大容器的特点 可以用下标访问的容器有 既可以插入也可以赋值 vector deque map 特别要注意一下 vector和deque如果没有预先指定大小 是不能用下标法插入元素的 序列式容器才可以在容器初始化的时候制定大小 关联式容器不
  • [vue3]子组件给父组件传值context.emit

    子组件 用context emit去触发事件 父组件 还是想vue2那样接收
  • 基于Python+Flask实现一个简易网页验证码登录系统案例

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