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获取运行目录与当前脚本目录的方法
Jun 01 Python
通过实例浅析Python对比C语言的编程思想差异
Aug 30 Python
python从入门到精通(DAY 2)
Dec 20 Python
利用Python如何生成hash值示例详解
Dec 20 Python
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
May 21 Python
解决vscode python print 输出窗口中文乱码的问题
Dec 03 Python
Python利用itchat库向好友或者公众号发消息的实例
Feb 21 Python
Flask教程之重定向与错误处理实例分析
Aug 01 Python
Pytorch提取模型特征向量保存至csv的例子
Jan 03 Python
jupyter notebook tensorflow打印device信息实例
Apr 20 Python
Jmeter调用Python脚本实现参数互相传递的实现
Jan 22 Python
Python实现制作销售数据可视化看板详解
Nov 27 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下通过系统信号量加锁方式获取递增序列ID
2009/09/25 PHP
PHP实用函数分享之去除多余的0
2015/02/06 PHP
基于php实现七牛抓取远程图片
2015/12/01 PHP
PHP自定义错误用法示例
2016/09/28 PHP
DIV菜单层实现代码
2010/11/19 Javascript
jQuery中$.fn的用法示例介绍
2013/11/05 Javascript
javascript去掉前后空格的实例
2013/11/07 Javascript
javascript常见操作汇总
2014/09/03 Javascript
js实现iGoogleDivDrag模块拖动层拖动特效的方法
2015/03/04 Javascript
三种带箭头提示框总结实例
2016/06/14 Javascript
ES6 javascript中class类的get与set用法实例分析
2017/10/30 Javascript
vuex的简单使用教程
2018/02/02 Javascript
使用pkg打包Node.js应用的方法步骤
2018/10/19 Javascript
vue使用el-upload上传文件及Feign服务间传递文件的方法
2019/03/15 Javascript
JS实现图片轮播效果实例详解【可自动和手动】
2019/04/04 Javascript
浅谈laytpl 模板空值显示null的解决方法及简单的js表达式
2019/09/19 Javascript
解决Vue 移动端点击出现300毫秒延迟的问题
2020/07/21 Javascript
在Python中使用成员运算符的示例
2015/05/13 Python
python实现电脑自动关机
2018/06/20 Python
Python 多维List创建的问题小结
2019/01/18 Python
python3.6数独问题的解决
2019/01/21 Python
python儿童学游戏编程知识点总结
2019/06/03 Python
pytorch 实现将自己的图片数据处理成可以训练的图片类型
2020/01/08 Python
python中可以声明变量类型吗
2020/06/18 Python
Python中pass的作用与使用教程
2020/11/13 Python
css3实现针线缝合效果(图解步骤)
2013/02/04 HTML / CSS
html5中svg canvas和图片之间相互转化思路代码
2014/01/24 HTML / CSS
HTML5 embed标签定义和用法详解
2014/05/09 HTML / CSS
Cecil Mode法国在线商店:女性时尚
2021/01/08 全球购物
师范学院教师自荐书
2014/01/31 职场文书
金融管理专业求职信
2014/07/10 职场文书
2014个人四风对照检查材料思想汇报
2014/09/18 职场文书
初三学生语文考试作弊检讨书
2014/12/14 职场文书
2015年教师节广播稿
2015/08/19 职场文书
使用python如何删除同一文件夹下相似的图片
2021/05/07 Python
关于redisson缓存序列化几枚大坑说明
2021/08/04 Redis