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 相关文章推荐
python迭代器的使用方法实例
Nov 21 Python
python解析模块(ConfigParser)使用方法
Dec 10 Python
Python中动态获取对象的属性和方法的教程
Apr 09 Python
Python的Django框架中从url中捕捉文本的方法
Jul 20 Python
python&amp;MongoDB爬取图书馆借阅记录
Feb 05 Python
解决PyCharm不运行脚本,而是运行单元测试的问题
Jan 17 Python
python找出列表中大于某个阈值的数据段示例
Nov 24 Python
python如何实现不用装饰器实现登陆器小程序
Dec 14 Python
Python通过zookeeper实现分布式服务代码解析
Jul 22 Python
python与js主要区别点总结
Sep 13 Python
filter使用python3代码进行迭代元素的实例详解
Dec 03 Python
python利用xpath爬取网上数据并存储到django模型中
Feb 26 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 安全检测代码片段(分享)
2013/07/05 PHP
Centos7 Yum安装PHP7.2流程教程详解
2019/07/02 PHP
将HTML自动转为JS代码
2006/06/26 Javascript
跨浏览器的 mouseenter mouseleave 以及 compareDocumentPosition的使用说明
2010/05/04 Javascript
网页右下角弹出窗体实现代码
2014/06/05 Javascript
jQuery中after()方法用法实例
2014/12/25 Javascript
js闭包所用的场合以及优缺点分析
2015/06/22 Javascript
详解JavaScript数组和字符串中去除重复值的方法
2016/03/07 Javascript
JavaScript笔记之数据属性和存储器属性
2016/03/31 Javascript
jquery实现上传文件大小类型的验证例子(推荐)
2016/06/25 Javascript
Jquery 整理元素选取、常用方法一览表
2016/11/26 Javascript
利用js获取下拉框中所选的值
2016/12/01 Javascript
Angular2 组件交互实例详解
2017/08/24 Javascript
vue ssr服务端渲染(小白解惑)
2019/11/10 Javascript
javaScript实现一个队列的方法
2020/07/14 Javascript
[30:00]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第二场 11.28
2020/12/01 DOTA
Python MySQLdb Linux下安装笔记
2015/05/09 Python
python用pandas数据加载、存储与文件格式的实例
2018/12/07 Python
python实现简单图片物体标注工具
2019/03/18 Python
python实现祝福弹窗效果
2019/04/07 Python
python实现视频分帧效果
2019/05/31 Python
Python 进程之间共享数据(全局变量)的方法
2019/07/16 Python
python删除文件夹下相同文件和无法打开的图片
2019/07/16 Python
Python定时任务随机时间执行的实现方法
2019/08/14 Python
Python使用Opencv实现图像特征检测与匹配的方法
2019/10/30 Python
Python之Django自动实现html代码(下拉框,数据选择)
2020/03/13 Python
俄罗斯在线购买飞机票、火车票、巴士票网站:Tutu.ru
2020/03/16 全球购物
优秀教师事迹简介
2014/02/02 职场文书
计算机大学生职业生涯规划书范文
2014/02/19 职场文书
2014年百日安全生产活动总结
2014/05/04 职场文书
学校感恩教育活动总结
2014/07/07 职场文书
2014年政协工作总结
2014/12/09 职场文书
工程服务质量承诺书
2015/04/29 职场文书
详解Python中下划线的5种含义
2021/07/15 Python
python开发的自动化运维工具ansible详解
2021/08/07 Python
使用python将HTML转换为PDF pdfkit包(wkhtmltopdf) 的使用方法
2022/04/21 Python