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 contextlib模块使用示例
Feb 18 Python
用Python写一个无界面的2048小游戏
May 24 Python
使用Python如何测试InnoDB与MyISAM的读写性能
Sep 18 Python
python matplotlib实现双Y轴的实例
Feb 12 Python
python中多个装饰器的调用顺序详解
Jul 16 Python
关于PyTorch 自动求导机制详解
Aug 18 Python
python sqlite的Row对象操作示例
Sep 11 Python
Python 生成一个从0到n个数字的列表4种方法小结
Nov 28 Python
python Popen 获取输出,等待运行完成示例
Dec 30 Python
tensorflow -gpu安装方法(不用自己装cuda,cdnn)
Jan 20 Python
TensorFlow绘制loss/accuracy曲线的实例
Jan 21 Python
Numpy中的数组搜索中np.where方法详细介绍
Jan 08 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 UTF8中文字符截断函数代码
2012/09/11 PHP
基于PHP文件操作的详解
2013/06/05 PHP
一个显示效果非常不错的PHP错误、异常处理类
2014/03/21 PHP
Smarty局部缓存的几种方法简介
2014/06/17 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
ThinkPHP like模糊查询,like多匹配查询,between查询,in查询,一般查询书写方法
2018/09/26 PHP
javascript实现数组去重的多种方法
2016/03/14 Javascript
如何消除inline-block属性带来的标签间间隙
2016/03/31 Javascript
关于JS中setTimeout()无法调用带参函数问题的解决方法
2016/06/21 Javascript
JS仿hao123导航页面图片轮播效果
2016/09/01 Javascript
Jquery Easyui进度条组件Progress使用详解(8)
2020/03/26 Javascript
JS使用正则实现去掉字符串左右空格的方法
2016/12/27 Javascript
bootstrap手风琴制作方法详解
2017/01/11 Javascript
Vue项目中添加锁屏功能实现思路
2018/06/29 Javascript
Bootstrap模态对话框用法简单示例
2018/08/31 Javascript
详解如何制作并发布一个vue的组件的npm包
2018/11/10 Javascript
解决vue项目,npm run build后,报路径错的问题
2020/08/13 Javascript
Javascript异步流程控制之串行执行详解
2020/09/27 Javascript
Nuxt的路由动画效果案例
2020/11/06 Javascript
[01:25:33]完美世界DOTA2联赛PWL S3 INK ICE vs Magma 第二场 12.20
2020/12/23 DOTA
Python实现豆瓣图片下载的方法
2015/05/25 Python
微信跳一跳游戏python脚本
2020/04/01 Python
Python随机生成身份证号码及校验功能
2018/12/04 Python
Python实现某论坛自动签到功能
2019/08/20 Python
Pycharm Git 设置方法
2020/09/15 Python
美国渔具店:FishUSA
2019/08/07 全球购物
高级人员简历的自我评价分享
2013/11/03 职场文书
简洁的英文求职信范文
2014/05/03 职场文书
经营理念标语
2014/06/21 职场文书
迎七一演讲稿
2014/09/12 职场文书
离婚协议书怎样才有法律效力
2014/10/10 职场文书
酒店办公室主任岗位职责
2015/04/01 职场文书
2015年置业顾问工作总结
2015/04/07 职场文书
未来,这5大方向都很适合创业
2019/07/22 职场文书
动态规划之使用备忘录来改进Javascript函数
2022/04/07 Javascript
mysql 子查询的使用
2022/04/28 MySQL