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 28 Python
python 计算两个日期相差多少个月实例代码
May 24 Python
浅谈python中copy和deepcopy中的区别
Oct 23 Python
Python从数据库读取大量数据批量写入文件的方法
Dec 10 Python
Python分支语句与循环语句应用实例分析
May 07 Python
python获取依赖包和安装依赖包教程
Feb 13 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
Mar 30 Python
基于pytorch中的Sequential用法说明
Jun 24 Python
Python Mock模块原理及使用方法详解
Jul 07 Python
Python实现像awk一样分割字符串
Sep 15 Python
安装python依赖包psycopg2来调用postgresql的操作
Jan 01 Python
Elasticsearch 数据类型及管理
Apr 19 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中html word 互转的方法
2016/01/28 PHP
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
2016/05/19 PHP
PHPStorm+XDebug进行调试图文教程
2016/06/13 PHP
Extjs学习笔记之七 布局
2010/01/08 Javascript
JavaScript对象之间的转换 jQuery对象和原声DOM
2011/03/07 Javascript
JS中prototype关键字的功能介绍及使用示例
2013/07/21 Javascript
jQuery实现公告文字左右滚动的实例代码
2013/10/29 Javascript
js点击选择文本的方法
2015/02/09 Javascript
JavaScript数据结构与算法之栈详解
2015/03/12 Javascript
JavaScript使用cookie实现记住账号密码功能
2015/04/27 Javascript
详解ES6中的let命令
2020/04/05 Javascript
vue监听滚动事件实现滚动监听
2017/04/11 Javascript
Form表单上传文件(type=&quot;file&quot;)的使用
2017/08/03 Javascript
jquery实现的简单轮播图功能【适合新手】
2018/08/17 jQuery
关于vue2强制刷新,解决页面不会重新渲染的问题
2019/10/29 Javascript
jQuery与原生JavaScript选择HTML元素集合用法对比分析
2019/11/26 jQuery
JS常用正则表达式超全集(密码强度校验,金额校验,IE版本,IPv4,IPv6校验)
2020/02/03 Javascript
[03:36]DOTA2完美大师赛coL战队趣味视频——我演你猜
2017/11/23 DOTA
[01:48]2018DOTA2亚洲邀请赛主赛事第二日五佳镜头 VG完美团战逆转TNC
2018/04/05 DOTA
Python操作SQLite简明教程
2014/07/10 Python
python 用下标截取字符串的实例
2018/12/25 Python
Python3.6.2调用ffmpeg的方法
2019/01/10 Python
PHP统计代码行数的小代码
2019/09/19 Python
详解python UDP 编程
2020/08/24 Python
利用Pycharm + Django搭建一个简单Python Web项目的步骤
2020/10/22 Python
python tkinter实现连连看游戏
2020/11/16 Python
Manuka Doctor英国官网:真正的麦卢卡蜂蜜和护肤品
2018/10/26 全球购物
团结演讲稿范文
2014/05/23 职场文书
先进员工事迹材料
2014/12/20 职场文书
物业工程部岗位职责
2015/02/11 职场文书
地震捐款简报
2015/07/21 职场文书
掌握一个领域知识,高效学习必备方法
2019/08/08 职场文书
Vue Element UI自定义描述列表组件
2021/05/18 Vue.js
详解php中流行的rpc框架
2021/05/29 PHP
Node.js实现爬取网站图片的示例代码
2022/04/04 NodeJs
Java 常见的限流算法详细分析并实现
2022/04/07 Java/Android