当前位置: 首页 > news >正文

Django集成图片验证码功能:基于django-simple-captcha实现

文章目录

    • 一、验证码工具选择
    • 二、验证码工作流程
    • 三、安装与基础配置
      • 安装依赖包
      • 项目配置
    • 四、核心功能实现
      • 后端实现
      • 前端实现
      • 实现效果
    • 五、Base64 图片格式说明


一、验证码工具选择

django-simple-captcha 是一款轻量且高度可定制的 Django 验证码应用,具有以下优势

  • 多样化验证码类型:支持随机字符、数学运算、字典单词等多种验证形式
  • 高度可定制:可自定义验证码样式、噪声效果和过滤规则
  • 良好的交互性:支持 AJAX 动态刷新,无需重新加载页面
  • 音频输出支持 :提供音频输出功能,提升可访问性

二、验证码工作流程

一个完整的验证码验证流程如下:

  1. 用户访问页面时,前端请求生成验证码
  2. 后端生成验证码图片和对应的验证 key,返回给前端
  3. 用户输入验证码并提交表单,前端将用户输入与验证 key 一同发送到后端
  4. 后端进行二次校验,验证用户输入的正确性
  5. 返回校验结果给前端,完成整个验证流程

在这里插入图片描述

三、安装与基础配置

安装依赖包

安装

pip install django-simple-captcha

项目配置

配置 settings.py

# `INSTALLED_APPS` 中添加 `'captcha'`
INSTALLED_APPS = [# ...'captcha',
]### 验证码配置
CAPTCHA_CHALLENGE_FUNCT = "captcha.helpers.math_challenge"  # 验证码生成方式
CAPTCHA_TIMEOUT = 1  # 验证码有效期,单位为分钟

迁移数据库(验证码需要存储验证记录)

python manage.py migrate captcha

四、核心功能实现

后端实现

下面通过一个视图集实现验证码的生成和验证功能,适用于前后端分离架构。点击查看完整代码

在这里插入图片描述

配置urls.py

# 管理后台 - 验证码
router.register(r"captcha", CaptchaViewSet, basename="captcha")

前端实现

编写一个验证码Vue组件,主要功能包括:

  • 显示验证码:通过img标签展示验证码图片,点击可刷新
  • 用户输入:提供输入框供用户输入验证码
  • 数据存储:隐藏域存储验证码的hashkey
  • 接口调用:调用API获取验证码图片和验证用户输入
  • 验证功能:提供validateCaptcha方法供父组件调用验证
<template><div class="captcha-wrapper"><!-- 用户输入框 --><input type="text" v-model="userInput" placeholder="请输入验证码" class="captcha-input" /><!-- 验证码图片(点击可刷新) --><img :src="captchaImage" @click="refreshCaptcha" class="captcha-img" /><!-- 隐藏域存储hashkey --><input type="hidden" v-model="captchaHashKey" /></div>
</template><script setup>
import { ref, onMounted } from 'vue'
import * as LoginApi from '@/api/login'const captchaImage = ref('')
const captchaHashKey = ref('')
const userInput = ref('')// 初始化获取验证码
const fetchCaptcha = async () => {try {const response = await LoginApi.getCode({})// console.log('验证码响应:', response) // 添加日志if (response.code === 0) {captchaImage.value = response.data.imageBasecaptchaHashKey.value = response.data.captchaKey} else {console.error('验证码加载失败:', response.msg)}} catch (error) {console.error('验证码加载失败:', error)}
}// 点击刷新验证码
const refreshCaptcha = () => fetchCaptcha()// 暴露验证方法
const validateCaptcha = async () => {try {const response = await LoginApi.reqCheck({captchaKey: captchaHashKey.value,captchaValue: userInput.value})return response.code === 0} catch (error) {console.error('验证码验证失败:', error)return false}
}// 组件挂载时加载验证码
onMounted(() => {fetchCaptcha()
})// 暴露接口给父组件
defineExpose({ validateCaptcha })
</script>

实现效果

可通过配置选项控制验证码是否开启,支持点击刷新验证码

在这里插入图片描述

点击查看完整代码

五、Base64 图片格式说明

在上面的实现中,我们使用了 Base64 格式来传输图片,这是一种将二进制数据编码为可打印字符的方法

  • 图片的 Base64 格式通常以 data:image/图片格式;base64, 开头
  • 示例:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA...
  • 优势:可以直接嵌入到 HTML 或 JSON 中,减少 HTTP 请求次数

适用场景

  • 小型图片资源(如验证码、图标等)
  • 需要跨平台传输二进制数据的场景

您正在阅读的是《Django从入门到实战》专栏!关注不迷路~

http://www.lryc.cn/news/610306.html

相关文章:

  • MySQL Router
  • Elasticsearch Ingest Pipeline 实现示例
  • C 语言枚举、typedef 与预处理详解
  • C语言的数组与字符串
  • AI产品经理面试宝典第61天:AI产品体验、数据安全与架构实战解析
  • 倒排索引:Elasticsearch 搜索背后的底层原理
  • 无公网环境下在centos7.9上使用kk工具部署k8s平台(amd64架构)
  • 数字信号处理_编程实例1
  • 【前端】JavaScript基础知识及基本应用
  • C++ STL list容器详解:从基础使用到高级特性
  • AI绘图-Stable Diffusion-WebUI的基本用法
  • SwiftUI ios开发中的 MVVM 架构深度解析与最佳实践
  • 深度学习零基础入门(4)-卷积神经网络架构
  • (JAVA)自建应用调用企业微信API接口,设置企业可信IP
  • 流量见顶时代,知识付费 IP 的破局逻辑
  • 汇川PLC通过ModbusTCP转Profinet网关连接西门子PLC配置案例
  • 飞算 JavaAI 实战:从代码生成到架构优化的全场景应用指南
  • 机试备考笔记 4/31
  • springboot博客实战笔记01
  • 登Nature子刊,基于基因测序和机器学习的废水流行病学评估,病毒检出时间最高提前4周
  • 机器学习(11):岭回归Ridge
  • 服务器的Mysql 集群技术
  • 经典设计模式
  • YOLO11涨点优化:原创自研DSAM注意力!基于BiLevelRoutingAttention的颠覆性升级
  • 06 基于sklearn的机械学习-欠拟合、过拟合、正则化、逻辑回归
  • Ethereum: 深度解析Web3世界的合规之门, ERC-1400证券型代币标准
  • ISCC认证:可持续生产的新标杆。ISCC如何更快认证
  • 线程互斥锁:守护临界区的关键
  • 服务器数据安全:利用阿里云OSS/腾讯云COS实现网站数据自动备份
  • 2.5 DICOM 传输语法(Transfer Syntaxes)