热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

django-simple-captcha使用以及添加动态ajax刷新验证

django-simple-captcha使用以及添加动态ajax刷新、验证django-simple-captcha是常用的添加验证码的package,但是使用起来会遇到一些问题,

django-simple-captcha 使用以及添加动态ajax刷新、验证

django-simple-captcha是常用的添加验证码的package,但是使用起来会遇到一些问题,比如ajax动态刷新和验证的问题,官网并没有给出详细的说明,这里做个简单的介绍。本文代码使用python3.4, django1.8,其他版本同样可以参考

django-simple-captcha 使用

  1. 安装 pip install django-simple-captcha, pip install Pillow
  2. 将captcha 加入 settings.py 的 INSTALLED_APPS
  3. 运行 python manager.py migrations 和 python manage.py migrate,以前的版本需要用到 python manage.py syncdb
  4. url路由加入urls.py的urlpatterns
urlpatterns = [
url(r'^captcha/', include('captcha.urls')) # 这是生成验证码的图片
url('^some_view/', finder.views.some_view) # finder是我的app名字,需要在文件头部加入 import finder.views
]
  1. 在forms.py中加入
from django import forms
from captcha.fields import CaptchaField

class CaptchaTestForm(forms.Form):
title = forms.CharField(max_length=100, label='title')
price = forms.FloatField(max_value=100, label='price') # 这里是我们需要的字段,以title和price为例
captcha = CaptchaField() # 为生成的验证码图片,以及输入框
  1. 在views.py中加入以下代码
def some_view(request):
if request.POST:
form = CaptchaTestForm(request.POST)

# Validate the form: the captcha field will automatically
# check the input
if form.is_valid():
human = True
return HttpResponse(form.cleaned_data) # 这里没有建立模型,如果成功则直接打印
else:
return HttpResponse('validate error')
else:
form = CaptchaTestForm()

return render_to_response('template.html',locals())
# Python 的内建函数 locals() 。它返回的字典对所有局部变量的名称与值进行映射,
  1. template.html 的内容


<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
head>
<body>
<form action='.' method='POST'>
{% csrf_token %}
{{ form }}
<input type="submit" value='submit' />
form>
body>
html>

到此打开 http://localhost:8000/some_view/ 就有有一个含有验证码的title,price的表单

这里我们简单说一下验证码生成的原理,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) # 到期时间

打开http://localhost:8000/some_view/ 会发现有一个隐藏字段


这个隐藏字段就是hashkey的值,django将hashkey传给页面以hidden的形式存在,提交表单时 hashkey与 输入的验证码 一起post到服务器,此时服务器验证 captcha_captchastore表中 hashkey 对应的 response 是否与 输入的验证码一致,如果一致则正确,不一致返回错误。

django-simple-captcha ajax动态验证

了解了验证码生成的原理,我没能就可以用ajax进行动态验证

  1. 将一下代码写入 views.py
def ajax_val(request):
if request.is_ajax():
cs = CaptchaStore.objects.filter(respOnse=request.GET['response'],
hashkey=request.GET['hashkey'])
if cs:
json_data={'status':1}
else:
json_data = {'status':0}
return JsonResponse(json_data)
else:
# raise Http404
json_data = {'status':0}
return JsonResponse(json_data) #需要导入 from django.http import JsonResponse
  1. 写入 urls.py, 为上面的view设置路由
urlpatterns = [
url(r'^captcha/', include('captcha.urls')) # 这是生成验证码的图片
url('^some_view/', finder.views.some_view), # finder是我的app名字,需要在文件头部加入 import finder.views
url('^ajax_val/', finder.views.ajax_val, name='ajax_val'), # 新加入
]
  1. tempalte.html 写入ajax


<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
head>
<body>
<form action='.' method='POST'>
{% csrf_token %}
{{ form }}
<input type="submit" value='submit' />
form>


<script>
$(function(){

$('#id_captcha_1').blur(function(){ // #id_captcha_1为输入框的id,当该输入框失去焦点是触发函数
json_data={
'response':$('#id_captcha_1').val(), // 获取输入框和隐藏字段id_captcha_0的数值
'hashkey':$('#id_captcha_0').val()
}
$.getJSON('/ajax_val', json_data, function(data){ //ajax发送
$('#captcha_status').remove()
if(data['status']){ //status返回1为验证码正确, status返回0为验证码错误, 在输入框的后面写入提示信息
$('#id_captcha_1').after('*验证码正确')
}else{
$('#id_captcha_1').after('*验证码错误')
}
});

});


})

script>
<script src='./jquery.js'>script> 记得导入jquery.js
body>
html>

至此我们完成了django-simple-captcha 的ajax动态验证

django-simple-captcha ajax刷新

如果当前验证码看不清,我们可以刷新一下,这个我们用ajax来做。 jango-simple-captcha本身提供了一个刷新页面,/refresh 在captcha/urls.py中:

url(r’refresh/$’, views.captcha_refresh, name=’captcha-refresh’)

这里在我们自己的urls.py中可以不做处理,直接使用 /captcha/refresh/
views.captcha_refresh 源码

# 只是源码介绍不用写入自己的代码中
def captcha_refresh(request):
""" Return json with new captcha for ajax refresh request """
if not request.is_ajax(): # 只接受ajax提交
raise Http404

new_key = CaptchaStore.generate_key()
to_json_respOnse= {
'key': new_key,
'image_url': captcha_image_url(new_key),
}
return HttpResponse(json.dumps(to_json_response), content_type='application/json')

通过阅读源代码我们发现, views.captcha_refresh 只接受ajax提交,最后返回 key 和 image_url 的json数据,这里的key就是 hashkey, 需要我们写入id为id_captcha_1的隐藏字段, image_url为验证码图片的新url,这里我们加入ajax刷新,点击验证码图片即可实现刷新,最新的tempalte.html 代码为



<html lang="en">
<head>
<meta charset="UTF-8">
<title>Documenttitle>
head>
<body>
<form action='.' method='POST'>
{% csrf_token %}
{{ form }}
<input type="submit" value='submit' />
form>


<script>
$(function(){
$('.captcha').css({
'cursor': 'pointer'
})
# ajax 刷新
$('.captcha').click(function(){
console.log('click');
$.getJSON("/captcha/refresh/",
function(result){
$('.captcha').attr('src', result['image_url']);
$('#id_captcha_0').val(result['key'])
});


});

# ajax动态验证
$('#id_captcha_1').blur(function(){ // #id_captcha_1为输入框的id,当该输入框失去焦点是触发函数
json_data={
'response':$('#id_captcha_1').val(), // 获取输入框和隐藏字段id_captcha_0的数值
'hashkey':$('#id_captcha_0').val()
}
$.getJSON('/ajax_val', json_data, function(data){ //ajax发送
$('#captcha_status').remove()
if(data['status']){ //status返回1为验证码正确, status返回0为验证码错误, 在输入框的后面写入提示信息
$('#id_captcha_1').after('*验证码正确')
}else{
$('#id_captcha_1').after('*验证码错误')
}
});

});


})

script>
<script src='./jquery.js'>script> 记得导入jquery.js
body>
html>

ok, 现在我们已经完成了对django-simple-captcha 的使用,自己学习的心得,希望能帮到更多的小伙伴。

感谢我的女朋友,她一直在身边默默的陪伴我,支持我。


推荐阅读
  • 用Python手把手教你搭建一个web框架-flask微框架!
    在之前的文章当中,小编已经教过大家怎么搭建一个Django框架,今天我们来探索另外的一种框架的搭建,这个框架就是web框架-flask微框架啦!首先我们带着以下的几个问题来阅读本文:1、flask ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 本文介绍了Composer依赖管理的重要性及使用方法。对于现代语言而言,包管理器是标配,而Composer作为PHP的包管理器,解决了PEAR的问题,并且使用简单,方便提交自己的包。文章还提到了使用Composer能够避免各种include的问题,避免命名空间冲突,并且能够方便地安装升级扩展包。 ... [详细]
  • Python已成为全球最受欢迎的编程语言之一,然而Python程序的安全运行存在一定的风险。本文介绍了Python程序安全运行需要满足的三个条件,即系统路径上的每个条目都处于安全的位置、"主脚本"所在的目录始终位于系统路径中、若python命令使用-c和-m选项,调用程序的目录也必须是安全的。同时,文章还提出了一些预防措施,如避免将下载文件夹作为当前工作目录、使用pip所在路径而不是直接使用python命令等。对于初学Python的读者来说,这些内容将有所帮助。 ... [详细]
  • 通过Anaconda安装tensorflow,并安装运行spyder编译器的完整教程
    本文提供了一个完整的教程,介绍了如何通过Anaconda安装tensorflow,并安装运行spyder编译器。文章详细介绍了安装Anaconda、创建tensorflow环境、安装GPU版本tensorflow、安装和运行Spyder编译器以及安装OpenCV等步骤。该教程适用于Windows 8操作系统,并提供了相关的网址供参考。通过本教程,读者可以轻松地安装和配置tensorflow环境,以及运行spyder编译器进行开发。 ... [详细]
  • 大坑|左上角_pycharm连接服务器同步写代码(图文详细过程)
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了pycharm连接服务器同步写代码(图文详细过程)相关的知识,希望对你有一定的参考价值。pycharm连接服务 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了markdown[软件代理设置]相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Flutter App 中创建模块并且依赖 Flutter
    在FlutterApp中打开对应的Android工程;并且向Android原生工程添加一个AndroidModule模块,并且在工程根settings. ... [详细]
  • Pico Neo 3教程☀️ 六、项目的配置总结及交互开发
    文章目录🟥SDK的导入和项目的设置1️⃣项目的部分配置2️⃣PlayerSettings设置✨将项目切换到Gamma颜色空间✨MinimumAPILevel ... [详细]
  • 第一种&amp;amp;lt;script&amp;amp;gt;$(&amp;quot;.eq&amp;quot;).on(&amp;qu ... [详细]
  • 原文:http:blog.linjunhalida.comblogpjaxgithub:https:github.comdefunktjquery-pjax ... [详细]
  • pyecharts 介绍
    一、pyecharts介绍ECharts,一个使用JavaScript实现的开源可视化库,可以流畅的运行在PC和移动设备上,兼容当前绝大部 ... [详细]
  • [Hei.Captcha]Asp.NetCore跨平台图形验证码实现
    写在前面说起来比较丢脸。我们有个手机的验证码发送逻辑需要使用验证码,这块本来项目里面就有验证码绘制逻辑,.NetFramework的,使用的包是System.Drawing,我 ... [详细]
  • Django3 使用 WebSocket 实现 WebShell
    △点击上方“Python猫”关注,回复“1”领取电子书剧照:《眷思量》作者:从零开始的程序员生活来源:https:www.c ... [详细]
  • Django框架详解:了解Django的含义和作用
    Django是一个开放源代码的Web应用框架,由Python写成。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的;Django主要由模型,模板,视图,UR ... [详细]
author-avatar
杨庄警务室
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有