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

简介: 在Web应用开发中,验证码是防止恶意攻击、自动化脚本滥用的重要手段。本文将介绍如何使用django-simple-captcha库在Django项目中快速集成图片验证码功能,包括安装配置、核心实现代码及使用方法。

一、验证码工具选择

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

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

二、验证码工作流程

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

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

image-20250804151240511.png

三、安装与基础配置

安装依赖包

安装

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

四、核心功能实现

后端实现

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

image-20250804152223001.png

配置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.imageBase
      captchaHashKey.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>

实现效果

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

image-20250804153105987.png

点击查看完整代码

五、Base64 图片格式说明

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

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

适用场景

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

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

相关文章
|
3月前
|
XML 测试技术 API
利用C#开发ONVIF客户端和集成RTSP播放功能
利用C#开发ONVIF客户端和集成RTSP播放功能
1527 123
|
7月前
|
测试技术 数据处理 调度
Dataphin功能Tips系列(57)「预览」vs「运行」:离线集成的神奇按钮
在数据开发过程中,使用Dataphin处理离线集成任务时,可能遇到数据过滤和字段计算组件配置正确性的验证问题。通过「预览」功能,可快速验证处理逻辑而不影响目标表;对于需要调度的任务,担心资源占用和耗时超出预期时,可使用「运行」功能进行全流程测试,评估实际耗时与资源消耗。「预览」适合逻辑验证,「运行」用于真实环境模拟,两者结合助力高效开发与调试。
194 5
|
7月前
|
SQL Java 关系型数据库
Dataphin功能Tips系列(53)-离线集成任务如何合理配置JVM资源
本文探讨了将MySQL数据同步至Hive时出现OOM问题的解决方案。
177 5
|
3月前
|
SQL 运维 关系型数据库
【产品升级】Dataphin V5.0版本发布:助力出海业务、增全量一体集成、异步调用API等更多功能等你发现
Dataphin是瓴羊推出的智能数据建设与治理平台,基于阿里巴巴内部实践,提供一站式数据建设与治理能力。V5.0版本研发新增支持Databricks作为离线计算引擎、支持MySQL数据库一键增全量同步、支持管理Hudi、Delta Lake表等;资产运营与消费持续提效,支持批量编辑目录名称及描述、Quick BI仪表板的上架管理等功能,增加资产可用性与盘点效率。
254 8
|
10月前
|
存储 NoSQL 关系型数据库
PolarDB开源数据库进阶课17 集成数据湖功能
本文介绍了如何在PolarDB数据库中接入pg_duckdb、pg_mooncake插件以支持数据湖功能, 可以读写对象存储的远程数据, 支持csv, parquet等格式, 支持delta等框架, 并显著提升OLAP性能。
716 2
|
7月前
|
传感器 供应链 物联网
农业单亩价值创造功能技术集成的概念与内涵
农业单亩价值创造的技术集成,通过系统性创新打破传统单一模式,融合现代科技与生态理念,提升资源效率、经济效益和生态价值。其核心在于技术协同,实现精准农业、智能装备和生物强化等多维联动,推动经济、生态和社会价值统一。同时,注重资源集约化与循环化利用,延伸产业链并升级价值链,从短期高产转向长期可持续发展。政策与制度创新支撑技术普惠,未来需因地制宜解决技术适配性和成本收益平衡问题,重塑农业评价体系,实现高质量发展。
|
7月前
|
存储 分布式计算 供应链
Dataphin功能Tips系列(51)-支持增全量一体实时集成
本文介绍了基于增全量一体实时集成的库存管理与分析解决方案。通过将业务中台的库存表同步至MaxCompute Delta表,实现离线与实时分析的统一支持。相比传统方案,该方法确保数据一致性,优化存储成本,降低维护复杂度,并大幅提升实时性,满足高效库存管理需求。
156 5
|
6月前
|
监控 安全 Java
Java 开发中基于 Spring Boot 3.2 框架集成 MQTT 5.0 协议实现消息推送与订阅功能的技术方案解析
本文介绍基于Spring Boot 3.2集成MQTT 5.0的消息推送与订阅技术方案,涵盖核心技术栈选型(Spring Boot、Eclipse Paho、HiveMQ)、项目搭建与配置、消息发布与订阅服务实现,以及在智能家居控制系统中的应用实例。同时,详细探讨了安全增强(TLS/SSL)、性能优化(异步处理与背压控制)、测试监控及生产环境部署方案,为构建高可用、高性能的消息通信系统提供全面指导。附资源下载链接:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)。
1106 0
|
7月前
|
资源调度 安全 数据安全/隐私保护
Cyber Triage 3.14 发布,带来全新用户界面、Hayabusa 集成、基线设定等功能
Cyber Triage 3.14 发布,带来全新用户界面、Hayabusa 集成、基线设定等功能
138 0
Cyber Triage 3.14 发布,带来全新用户界面、Hayabusa 集成、基线设定等功能
|
8月前
|
缓存 前端开发 API
(网页系统集成CAD功能)在线CAD中配置属性的使用教程
本文介绍了Mxcad SDK在线预览和编辑CAD图纸的功能及配置方法。通过Vite、CDN或Webpack实现集成,用户可自定义设置以满足项目需求。主要内容包括:1)`createMxCad()`方法的初始属性配置,如画布ID、WASM文件路径、字体加载路径等;2)`MxFun.setIniset()`方法提供的更多CAD初始配置;3)`McObject`对象API用于动态调整视图背景色、浏览模式等。此外,还提供了在线Demo(https://demo2.mxdraw3d.com:3000/mxcad/)供用户测试实时效果。

热门文章

最新文章