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发腾讯微博代码分享
Jan 10 Python
python使用wmi模块获取windows下硬盘信息的方法
May 15 Python
Python爬虫代理IP池实现方法
Jan 05 Python
批量获取及验证HTTP代理的Python脚本
Apr 23 Python
python数据分析数据标准化及离散化详解
Feb 26 Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
Oct 11 Python
pyinstaller还原python代码过程图解
Jan 08 Python
解决tensorflow打印tensor有省略号的问题
Feb 04 Python
python实现PCA降维的示例详解
Feb 24 Python
python生成任意频率正弦波方式
Feb 25 Python
Django模板之基本的 for 循环 和 List内容的显示方式
Mar 31 Python
matplotlib.pyplot.plot()参数使用详解
Jul 28 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 图片上传类代码
2009/07/17 PHP
PHP通过插入mysql数据来实现多机互锁实例
2014/11/05 PHP
PHP实现获取FLV文件的时间
2015/02/10 PHP
10条php编程小技巧
2015/07/07 PHP
php中preg_replace正则替换用法分析【一次替换多个值】
2017/01/17 PHP
PHP 7.1中AES加解密方法mcrypt_module_open()的替换方案
2017/10/17 PHP
JavaScript中的排序算法代码
2011/02/22 Javascript
JavaScript获取页面上某个元素的代码
2011/03/13 Javascript
js下获得客户端操作系统的函数代码(1:vista,2:windows7,3:2000,4:xp,5:2003,6:2008)
2011/10/31 Javascript
jQuery随机切换图片的小例子
2013/04/18 Javascript
jQuery实现鼠标经过像翻页和描点链接效果
2016/08/08 Javascript
如何利用JSHint减少JavaScript的错误
2016/08/23 Javascript
微信小程序 ES6Promise.all批量上传文件实现代码
2017/04/14 Javascript
vue2.0 与 bootstrap datetimepicker的结合使用实例
2017/05/22 Javascript
JavaScript自执行函数和jQuery扩展方法详解
2017/10/27 jQuery
jQuery实现的电子时钟效果完整示例
2018/04/28 jQuery
mpvue项目中使用第三方UI组件库的方法
2018/09/30 Javascript
详解如何快速配置webpack多入口脚手架
2018/12/28 Javascript
解决layer.prompt无效的问题
2019/09/24 Javascript
Node.js fs模块原理及常见用途
2020/10/22 Javascript
Python编写的com组件发生R6034错误的原因与解决办法
2013/04/01 Python
Python基于回溯法子集树模板解决m着色问题示例
2017/09/07 Python
Python爬虫天气预报实例详解(小白入门)
2018/01/24 Python
Python实现的远程登录windows系统功能示例
2018/06/21 Python
Python根据成绩分析系统浅析
2019/02/11 Python
pymongo中group by的操作方法教程
2019/03/22 Python
python实现的爬取电影下载链接功能示例
2019/08/26 Python
使用pytorch 筛选出一定范围的值
2020/06/28 Python
Python爬虫中Selenium实现文件上传
2020/12/04 Python
英格兰橄榄球商店:England Rugby Store
2016/12/17 全球购物
卡西欧G-SHOCK英国官网: 防水防震手表
2018/01/08 全球购物
国庆节文艺活动方案
2014/02/03 职场文书
毕业酒会致辞
2015/07/29 职场文书
2015小学新教师个人工作总结
2015/10/14 职场文书
python疲劳驾驶困倦低头检测功能的实现
2022/04/04 Python
vue实现列表垂直无缝滚动
2022/04/08 Vue.js