Django-simple-captcha验证码包使用方法详解


Posted in Python onNovember 28, 2020

django-simple-captcha是django的验证码包,非常简单实用,这次记录的是如何点击验证码后刷新验证码,因为这个功能官方文档并没有详细给出。

django-simple-captcha官方文档:http://django-simple-captcha.readthedocs.io/en/latest/

django-simple-captcha的github网址:https://github.com/mbi/django-simple-captcha

开始

1.安装 pip install django-simple-captcha, pip install Pillow

2.将captcha 加入 settings.py 的 INSTALLED_APPS

3.运行 python manage.py makemigrations 和 python manage.py migrate

4.url路由加入urls.py的urlpatterns

urlpatterns = [
  path('captcha/', include('captcha.urls')),    # 图片验证码 路由
  path('refresh_captcha/', views.refresh_captcha),  # 刷新验证码,ajax
  path('test/',IndexView.as_view()),         #get与post请求路径
]

5.在views.py中加入以下代码

from django.shortcuts import render
from django.views.generic import View
from captcha.models import CaptchaStore
from captcha.helpers import captcha_image_url
from django.http import HttpResponse
import json


# 创建验证码
def captcha():
  hashkey = CaptchaStore.generate_key() # 验证码答案
  image_url = captcha_image_url(hashkey) # 验证码地址
  captcha = {'hashkey': hashkey, 'image_url': image_url}
  return captcha

#刷新验证码
def refresh_captcha(request):
  return HttpResponse(json.dumps(captcha()), content_type='application/json')

# 验证验证码
def jarge_captcha(captchaStr, captchaHashkey):
  if captchaStr and captchaHashkey:
    try:
      # 获取根据hashkey获取数据库中的response值
      get_captcha = CaptchaStore.objects.get(hashkey=captchaHashkey)
      if get_captcha.response == captchaStr.lower(): # 如果验证码匹配
        return True
    except:
      return False
  else:
    return False


class IndexView(View):
  def get(self, request):
    hashkey = CaptchaStore.generate_key() # 验证码答案
    image_url = captcha_image_url(hashkey) # 验证码地址
    print(hashkey,image_url)
    captcha = {'hashkey': hashkey, 'image_url': image_url}
    return render(request, "login.html", locals())

  def post(self, request):
    capt = request.POST.get("captcha", None) # 用户提交的验证码
    key = request.POST.get("hashkey", None) # 验证码答案
    if jarge_captcha(capt, key):
      return HttpResponse("验证码正确")
    else:
      return HttpResponse("验证码错误")

6.templates文件夹下login.html的内容

{% load static %}
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script>
  <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/4.0.0/js/bootstrap.js"></script>
</head>
<body>
  <form action="/test/" method="post">
    {% csrf_token %}
    <a href="#" rel="external nofollow" class="captcha">
      <img src="{{ captcha.image_url }}" alt="点击切换" id="id_captcha" >
    </a> <br>
    <input type="text" name="captcha" placeholder="验证码"> <br>
    <input value="{{ captcha.hashkey }}" name="hashkey" type="hidden" id="id_captcha_0">
    <button type="submit" class="btn btn-primary btn-block ">提交</button>
  </form>
<script>
    <!-- 动态刷新验证码js -->
    $(document).ready(function(){
      $('.captcha').click(function () {
        $.getJSON("/refresh_captcha/", function (result) {
          $('#id_captcha').attr('src', result['image_url']);
          $('#id_captcha_0').val(result['hashkey'])
        });
      });
    });
</script>
</body>
</html>

django-simple-captcha并没有使用session对验证码进行存储,而是使用了数据库,当你在做数据库迁移的时候会生成一个表 captcha_captchastore ,包含以下字段

challenge = models.CharField(blank=False, max_length=32) # 验证码大写或者数学计算比如 1+1
response = models.CharField(blank=False, max_length=32) # 需要输入的验证码 验证码小写或数学计算的结果 比如 2
hashkey = models.CharField(blank=False, max_length=40, unique=True) # hash值
expiration = models.DateTimeField(blank=False) # 到期时间

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
天翼开放平台免费短信验证码接口使用实例
Dec 18 Python
Django1.7+python 2.78+pycharm配置mysql数据库
Oct 09 Python
开源Web应用框架Django图文教程
Mar 09 Python
使用Python进行QQ批量登录的实例代码
Jun 11 Python
对pandas的行列名更改与数据选择详解
Nov 12 Python
解决使用export_graphviz可视化树报错的问题
Aug 09 Python
python内存管理机制原理详解
Aug 12 Python
如何在 Django 模板中输出 &quot;{{&quot;
Jan 24 Python
Opencv求取连通区域重心实例
Jun 04 Python
Linux安装Python3如何和系统自带的Python2并存
Jul 23 Python
Python绘制词云图之可视化神器pyecharts的方法
Feb 23 Python
python上下文管理的使用场景实例讲解
Mar 03 Python
如何通过Python实现RabbitMQ延迟队列
Nov 28 #Python
python 用Matplotlib作图中有多个Y轴
Nov 28 #Python
基于python实现监听Rabbitmq系统日志代码示例
Nov 28 #Python
Python Http请求json解析库用法解析
Nov 28 #Python
基于Django集成CAS实现流程详解
Nov 28 #Python
Django haystack实现全文搜索代码示例
Nov 28 #Python
windows下python 3.9 Numpy scipy和matlabplot的安装教程详解
Nov 28 #Python
You might like
php网上商城购物车设计代码分享
2012/02/15 PHP
PHP闭包(Closure)使用详解
2013/05/02 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十一)
2014/06/25 PHP
ThinkPHP框架使用redirect实现页面重定向的方法实例分析
2018/04/12 PHP
Javascript笔记一 js以及json基础使用说明
2010/05/22 Javascript
IE6/7/8/9不支持exec的简写方式
2011/05/25 Javascript
js日期对象兼容性的处理方法
2014/01/28 Javascript
常见的原始JS选择器使用方法总结
2014/04/09 Javascript
JavaScript、jQuery与Ajax的关系
2016/01/24 Javascript
JS组件系列之Bootstrap Icon图标选择组件
2016/01/28 Javascript
JavaScript操作HTML DOM节点的基础教程
2016/03/11 Javascript
Javascript中常用的检测方法小结
2016/10/08 Javascript
jQuery内容筛选选择器实例代码
2017/02/06 Javascript
Vue 短信验证码组件开发详解
2017/02/14 Javascript
基于JS实现网页中的选项卡(两种方法)
2017/06/16 Javascript
package.json配置文件构成详解
2019/08/27 Javascript
layui时间控件选择时间范围的实现方法
2019/09/28 Javascript
vue 解决IOS10低版本白屏的问题
2020/11/17 Javascript
Python实现把数字转换成中文
2015/06/29 Python
Python去除、替换字符串空格的处理方法
2018/04/01 Python
十个Python练手的实战项目,学会这些Python就基本没问题了(推荐)
2019/04/26 Python
python程序变成软件的实操方法
2019/06/24 Python
详解用pyecharts Geo实现动态数据热力图城市找不到问题解决
2019/06/26 Python
Python绘制动态水球图过程详解
2020/06/03 Python
python装饰器实现对异常代码出现进行自动监控的实现方法
2020/09/15 Python
详解CSS3中nth-child与nth-of-type的区别
2017/01/05 HTML / CSS
h5移动端调用支付宝、微信支付的实现
2020/06/08 HTML / CSS
欧迪办公美国官网:Office Depot
2016/08/22 全球购物
MySQL面试题目集锦
2016/04/14 面试题
三方合作协议书范本
2014/04/18 职场文书
员工辞退通知书
2015/04/17 职场文书
教师节感想
2015/08/11 职场文书
用 Python 定义 Schema 并生成 Parquet 文件详情
2021/09/25 Python
详解MySQL中timestamp和datetime时区问题导致做DTS遇到的坑
2021/12/06 MySQL
Python语言中的数据类型-序列
2022/02/24 Python
解决ubuntu安装软件时,status-code=409报错的问题
2022/12/24 Servers