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实现巡检系统(solaris)示例
Apr 02 Python
用Python从零实现贝叶斯分类器的机器学习的教程
Mar 31 Python
jupyter安装小结
Mar 13 Python
Python模拟三级菜单效果
Sep 11 Python
Python实现针对含中文字符串的截取功能示例
Sep 22 Python
python中virtualenvwrapper安装与使用
May 20 Python
Python实现的文本对比报告生成工具示例
May 22 Python
python requests爬取高德地图数据的实例
Nov 10 Python
值得收藏,Python 开发中的高级技巧
Nov 23 Python
通过python改变图片特定区域的颜色详解
Jul 15 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
Jun 24 Python
python安装第三方库如xlrd的方法
Oct 31 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
对盗链说再见...
2006/10/09 PHP
如何在PHP中使用Oracle数据库(5)
2006/10/09 PHP
php Try Catch异常测试
2009/03/01 PHP
php中session过期时间设置及session回收机制介绍
2014/05/05 PHP
Yii不依赖Model的表单生成器用法实例
2014/12/04 PHP
php实现图片上传并利用ImageMagick生成缩略图
2016/03/14 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
html数组字符串拼接的最快方法
2009/09/16 Javascript
jQuery中next()方法用法实例
2015/01/07 Javascript
JavaScript中数据结构与算法(五):经典KMP算法
2015/06/19 Javascript
JS实现选项卡实例详解
2015/11/17 Javascript
jQuery动画显示和隐藏效果实例演示(附demo源码下载)
2015/12/31 Javascript
带有定位当前位置的百度地图前端web api实例代码
2016/06/21 Javascript
js模式化窗口问题![window.dialogArguments]
2016/10/30 Javascript
Bootstrap导航中表单简单实现代码
2017/03/06 Javascript
详解vue项目构建与实战
2017/06/27 Javascript
angularjs 的数据绑定实现原理
2018/07/02 Javascript
在Node.js下运用MQTT协议实现即时通讯及离线推送的方法
2019/01/24 Javascript
vue quill editor 使用富文本添加上传音频功能
2020/01/14 Javascript
Vue设置长时间未操作登录自动到期返回登录页
2020/01/22 Javascript
小程序实现列表倒计时功能
2021/01/29 Javascript
python套接字流重定向实例汇总
2016/03/03 Python
利用Python实现图书超期提醒
2016/08/02 Python
python实现自动发送报警监控邮件
2018/06/21 Python
Scrapy框架使用的基本知识
2018/10/21 Python
浅谈python下含中文字符串正则表达式的编码问题
2018/12/07 Python
python实现对输入的密文加密
2019/03/20 Python
pytorch之ImageFolder使用详解
2020/01/06 Python
Python自动发送和收取邮件的方法
2020/08/12 Python
List、Map、Set三个接口,存取元素时,各有什么特点?
2015/09/27 面试题
股东协议书范本
2014/04/14 职场文书
法院四风对照检查材料思想汇报
2014/10/06 职场文书
出纳工作检讨书范文
2014/12/27 职场文书
甲午大海战观后感
2015/06/02 职场文书
JavaScript文档对象模型DOM
2021/11/20 Javascript
使用 Apache 反向代理的设置技巧
2022/01/18 Servers