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自定义scrapy中间模块避免重复采集的方法
Apr 07 Python
Python中的各种装饰器详解
Apr 11 Python
详解Django框架中的视图级缓存
Jul 23 Python
python3 dict ndarray 存成json,并保留原数据精度的实例
Dec 06 Python
python 读写文件包含多种编码格式的解决方式
Dec 20 Python
在tensorflow中设置保存checkpoint的最大数量实例
Jan 21 Python
python3 sorted 如何实现自定义排序标准
Mar 12 Python
Python基于yield遍历多个可迭代对象
Mar 12 Python
Python函数默认参数常见问题及解决方案
Mar 26 Python
如何利用python进行时间序列分析
Aug 04 Python
Python 实现PS滤镜的旋涡特效
Dec 03 Python
解决pytorch读取自制数据集出现过的问题
May 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
php实现的一个简单json rpc框架实例
2015/03/30 PHP
php用户登录之cookie信息安全分析
2016/05/13 PHP
php结合mysql与mysqli扩展处理事务的方法
2016/06/29 PHP
php用xpath解析html的代码实例讲解
2019/02/14 PHP
List the Codec Files on a Computer
2007/06/18 Javascript
JQuery入门——移除绑定事件unbind方法概述及应用
2013/02/05 Javascript
一个检测表单数据的JavaScript实例
2014/10/31 Javascript
轻松创建nodejs服务器(5):事件处理程序
2014/12/18 NodeJs
javascript自定义右键弹出菜单实现方法
2015/05/25 Javascript
Javascript函数式编程简单介绍
2015/10/11 Javascript
前端分页功能的实现以及原理(jQuery)
2017/01/22 Javascript
jQuery插件ImgAreaSelect实现头像上传预览和裁剪功能实例讲解一
2017/05/26 jQuery
vue 框架下自定义滚动条(easyscroll)实现方法
2019/08/29 Javascript
layui 点击重置按钮, select 并没有被重置的解决方法
2019/09/03 Javascript
微信小程序实现上传多个文件 超过10个
2020/03/30 Javascript
JavaScript实现点击图片换背景
2020/11/20 Javascript
jquery实现穿梭框功能
2021/01/19 jQuery
简单的编程0基础下Python入门指引
2015/04/01 Python
在CentOS上配置Nginx+Gunicorn+Python+Flask环境的教程
2016/06/07 Python
浅析Python的web.py框架中url的设定方法
2016/07/11 Python
Python使用numpy模块实现矩阵和列表的连接操作方法
2019/06/26 Python
Python使用正则表达式分割字符串的实现方法
2019/07/16 Python
pytorch-神经网络拟合曲线实例
2020/01/15 Python
Python爬取阿拉丁统计信息过程图解
2020/05/12 Python
python 实现读取csv数据,分类求和 再写进 csv
2020/05/18 Python
如何一键升级Python所有包
2020/11/05 Python
python中把元组转换为namedtuple方法
2020/12/09 Python
村委会主任先进事迹
2014/01/15 职场文书
科学育儿宣传标语
2014/10/08 职场文书
2014年班主任工作总结
2014/11/08 职场文书
被告代理词范文
2015/05/25 职场文书
2016年庆祝六一儿童节活动总结
2016/04/06 职场文书
2019求职信大礼包
2019/05/15 职场文书
Django使用echarts进行可视化展示的实践
2021/06/10 Python
Java面试题冲刺第十五天--设计模式
2021/08/07 面试题
Vue的列表之渲染,排序,过滤详解
2022/02/24 Vue.js