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中json格式数据输出的简单实现方法
Oct 31 Python
python爬虫正则表达式之处理换行符
Jun 08 Python
django_orm查询性能优化方法
Aug 20 Python
numpy中的ndarray方法和属性详解
May 27 Python
python获取当前文件路径以及父文件路径的方法
Jul 10 Python
Python3将jpg转为pdf文件的方法示例
Dec 13 Python
关于Tensorflow分布式并行策略
Feb 03 Python
部署Django到阿里云服务器教程示例
Jun 03 Python
matplotlib设置颜色、标记、线条,让你的图像更加丰富(推荐)
Sep 25 Python
selenium如何定位span元素的实现
Jan 13 Python
使用bandit对目标python代码进行安全函数扫描的案例分析
Jan 27 Python
Flask搭建一个API服务器的步骤
May 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
DC动漫人物排行
2020/03/03 欧美动漫
PHP zlib扩展实现页面GZIP压缩输出
2010/06/17 PHP
php实现数组筛选奇数和偶数示例
2014/04/11 PHP
ThinkPHP视图查询详解
2014/06/30 PHP
ThinkPHP写数组插入与获取最新插入数据ID实例
2014/11/03 PHP
PHP中使用hidef扩展代替define提高性能
2015/04/09 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
js trim函数 去空格函数与正则集锦
2009/11/20 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器(优化篇)
2013/06/28 Javascript
JS.elementGetStyle(element, style)应用示例
2013/09/24 Javascript
jQuery中$.get、$.post、$.getJSON和$.ajax的用法详解
2014/11/19 Javascript
JQuery实现动态操作表格
2017/01/11 Javascript
js 性能优化之快速响应的用户界面
2017/02/15 Javascript
vue + socket.io实现一个简易聊天室示例代码
2017/03/06 Javascript
Kindeditor单独调用多图上传实例
2017/07/31 Javascript
如何在Vue中使用CleaveJS格式化你的输入内容
2018/12/14 Javascript
微信小程序中weui用法解析
2019/10/21 Javascript
Vue项目开发常见问题和解决方案总结
2020/09/11 Javascript
[00:32]2018DOTA2亚洲邀请赛Newbee出场
2018/04/03 DOTA
在Python中使用判断语句和循环的教程
2015/04/25 Python
举例讲解Python中的死锁、可重入锁和互斥锁
2015/11/05 Python
Python实现类似jQuery使用中的链式调用的示例
2016/06/16 Python
Python制作简易注册登录系统
2016/12/15 Python
python 基本数据类型占用内存空间大小的实例
2018/06/12 Python
详解Django+Uwsgi+Nginx的生产环境部署
2018/06/25 Python
Python爬取网站图片并保存的实现示例
2021/02/26 Python
法国大使拉杆箱官网:DELSEY Paris
2018/03/20 全球购物
意大利在线大学图书馆:Libreria universitaria
2019/07/16 全球购物
英国网上自行车商店:Tredz Bikes
2019/10/29 全球购物
伊莱克斯阿根廷网上商店:Tienda Electrolux
2021/03/08 全球购物
UNIX文件系统分类
2014/11/11 面试题
中医药大学市场营销专业自荐信
2013/09/29 职场文书
大学生求职信
2014/06/17 职场文书
Python控制台输出俄罗斯方块的方法实例
2021/04/17 Python
基于Redis位图实现用户签到功能
2021/05/08 Redis
Django框架中视图的用法
2022/06/10 Python