插拔式自定义图片验证码(开源)

1:第一种自定义验证码(推荐)

  1 前端:   <img id ="img"  src="/路由/"> <span {{ dict.error }}</span>
  2 前端js刷新验证码:
  3 <script>
  4     img =document.getElementById("img");
  5     img.onclick = function () {
  6         img.src = img.src + "?";    #利用加?来刷新图片生成更换
  7     }
  8 </script>
  9
 10
 11
 12 校验验证码函数:
 13 if request.method == "POST":
 14         dict = {}           #用户返回错误信息
 15         # 判断验证码
 16         input_code = request.POST.get("code").upper() #输入的验证码
 17         obj = F1(request.POST)  #输入框的所有数据
 18
 19         if obj.is_valid() and input_code == request.session["code"]:   ##判断输入的值是否等于注册session的验证码(生成随机码的时候已经注册到session)
 20
 21             # 插入数据库,这里是删除不需要添加到数据表的key
 22             obj.cleaned_data.pop("again_password")
 23             obj.cleaned_data.pop("code")
 24             models.UserInfo.objects.create_user(**obj.cleaned_data)
 25             return redirect("/index/login/")  #返回页面
 26         else:
 27             dict["error"] = "验证码不匹配"
 28             return render(request,"register.html",{"obj":obj,"dict":dict})
 29
 30
 31
 32
 33 验证码生成(直接复制到对应视图最下面):
 34 后端视图对应的路由 :
 35
 36 #验证码:
 37 from PIL import Image, ImageDraw, ImageFont, ImageFilter
 38 import random
 39
 40
 41 #随机颜色
 42 def random_color():
 43     return random.randint(0,255),random.randint(0,255),random.randint(0,255)
 44
 45 def code(request,width=150, height=35):
 46     # with open("1.png", "wb") as f:
 47     # 定义一个图片,并且设置参数
 48     img_obj = Image.new(‘RGB‘, size=(width, height), color=(255, 255, 255))  # 长宽   颜色
 49
 50     # 创建画笔在画布上
 51     draw_obj = ImageDraw.Draw(img_obj)
 52     # 自定义字体
 53     font_obj = ImageFont.truetype(‘Monaco.ttf‘, 28)
 54
 55     # 写干扰点
 56     for i in range(40):
 57         draw_obj.point([random.randint(0, width), random.randint(0, height)], fill=random_color())
 58
 59     # 写干扰圆圈
 60     for i in range(40):
 61         draw_obj.point([random.randint(0, width), random.randint(0, height)], fill=random_color())
 62         x = random.randint(0, width)
 63         y = random.randint(0, height)
 64         draw_obj.arc((x, y, x + 4, y + 4), 0, 90, fill=random_color())
 65
 66         # 画干扰线
 67     for i in range(5):
 68         x1 = random.randint(0, width)
 69         y1 = random.randint(0, height)
 70         x2 = random.randint(0, width)
 71         y2 = random.randint(0, height)
 72
 73         draw_obj.line((x1, y1, x2, y2), fill=random_color())
 74
 75         img = img_obj.filter(ImageFilter.EDGE_ENHANCE_MORE)
 76
 77     # 随机字符串
 78     for i in range(5):
 79         l = chr(random.randint(97, 122))  # 小写字母
 80         b = chr(random.randint(65, 90))  # 大学字母
 81         n = str(random.randint(0, 9))
 82
 83         t = random.choice([b, l, n])
 84
 85         # 在text参数设置坐标,字符串,颜色,字体
 86         draw_obj.text((i * 30, 0), t, fill=random_color(), font=font_obj)
 87
 88     #放到session,并且忽略大小写
 89     request.session["code"] = "".join(temp).upper()
 90
 91     #写入内存,显示到网页上
 92     f = open("1.png","rb")
 93     data =f.read()
 94     from io import BytesIO
 95     f1 = BytesIO()
 96     img_obj.save(f1,format="PNG")
 97     image_data = f1.getvalue()
 98
 99
100     return HttpResponse(image_data,content_type="image/png")

2:第二种验证码(据说有BUG)博主没用过

1) 安装 django-simple-captcha:
pip install django-simple-captcha

2)注册captcha
INSTALLED_APPS = [
    ‘django.contrib.admin‘,
    ‘django.contrib.auth‘,
    ‘django.contrib.contenttypes‘,
    ‘django.contrib.sessions‘,
    ‘django.contrib.messages‘,
    ‘django.contrib.staticfiles‘,
    ‘captcha‘,
]
也可以个性化定制,在 settings.py中添加如下代码,详情参考官方文档:
# 设置 captcha 图片大小
CAPTCHA_IMAGE_SIZE = (80, 45)
# 字符个数
CAPTCHA_LENGTH = 4
# 超时(minutes)
CAPTCHA_TIMEOUT = 1

3)创建它的表
python manage.py makemigrations
python manage.py migrate

4)添加路由
urlpatterns = [
    url(‘admin/‘, admin.site.urls),
    # 图片验证码 路由
    url(‘captcha/‘, include(‘captcha.urls‘))

]
再添加ajax刷新请求的二级路由,ajxa请求地址: captcha/refresh_captcha/
url(‘refresh_captcha/‘, views.refresh_captcha),    # 刷新验证码,ajax

5)在form文件中直接导入模块:
from captcha.fields import CaptchaField

6)在写的form类下填写生成标签:
Captcha = CaptchaField()

7)前端设置跟其他组件一致,存放数据库:
obj.cleaned_data.pop("captcha"," ")
ps:django-simple-captcha有一些多余的功能,所以从它的源代码中提取了一部分加以修改,生成了一个简单的验证码模块。在使用django-simple-captcha时发现了一个Bug,   该库使用HttpResponse.write(image_data)的方式返回验证码图片数据,导致验证码图片无法显示,具体原因还不清楚,   不过换成HttpResponse(content=image_data)的方式就好了。这也是我自定义验证码功能的原因。

原文地址:https://www.cnblogs.com/wanghong1994/p/11602444.html

时间: 2024-10-12 08:49:46

插拔式自定义图片验证码(开源)的相关文章

字符型图片验证码识别完整过程及Python实现

1   摘要 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越来越严峻.本文介绍了一套字符验证码识别的完整流程,对于验证码安全和OCR识别技术都有一定的借鉴意义. 2   关键词 关键词:安全,字符图片,验证码识别,OCR,Python,SVM,PIL 3   免责声明 本文研究所用素材来自于某旧Web框架的网站 完全对外公开 的公共图片资源. 本文只做了该网站对外公开的公共图片资源进行了爬取, 并未越权 

tesseract-ocr图片识别开源工具

tesseract-ocr图片识别开源工具 今天看同事的ppt,提到了图片识别,又tesseract-ocr,觉得不错,试一下,如果效果好可以用来做验证码的识别 http://code.google.com/p/tesseract-ocr/ tesseract是一款开源工具,我安装了Windows版试水先 1.首先登录首页在‘下载’页面下载 Java代码   tesseract-ocr-setup-xx.xx.exe chi_sim.traineddata.gz   中文语言包 2.双击即可安装

PHP编写的图片验证码类文件分享方法

适用于自定义的验证码类! <?php /* * To change this license header, choose License Headers in Project Properties.* To change this template file, choose Tools | Templates* and open the template in the editor.*/Class Image{ private $img;public $width = 85;public $h

Python 实现识别弱图片验证码

目前,很多网站为了防止爬虫肆意模拟浏览器登录,采用增加验证码的方式来拦截爬虫.验证码的形式有多种,最常见的就是图片验证码.其他验证码的形式有音频验证码,滑动验证码等.图片验证码越来越高级,识别难度也大幅提高,就算人为输入也经常会输错.本文主要讲解识别弱图片验证码. 1 图片验证码强度 图片验证码主要采用加干扰线.字符粘连.字符扭曲方式来增强识别难度. 加干扰线 加干扰线也分为两种,一种是线条跟字符同等颜色,另一种则线条的颜色是五颜六色. 字符粘连 各个字符之间的间隔比较小,互相依靠,能以分割.

图片验证码功能实现

自定义图片验证类 import os import time import random from PIL import Image, ImageDraw, ImageFont class Captcha(object): def __init__(self, request): """ 初始化,设置各种属性 """ self.django_request = request self.session_key = "_django_ca

怎样用Java自制优秀的图片验证码?这样!

Completely Automated Public Turing test to tell Computers and Humans Apart 全自动区分计算机和人类的图灵测试 简称CAPTCHA,这就是验证码的含义.它可以防止恶意破解密码.刷票.论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试等. 虽然网上有一些很不错的验证码开源插件如kaptcha等,但是如果自己能够熟悉原理并且自己动手写,那岂不是一件很酷的事情么?今天给大家分享的这个教程是基于J

spring securtty学习 (三)图片验证码认证

图片验证码,在spring security 学习(二)用户认证自定义上添加. 具体步骤相对来说简单分为三步:生成图片验证码.显示给用户输入,登陆认证中加入校验验证码: 添加验证依赖 <!-- 验证码 --><dependency> <groupId>org.springframework.social</groupId> <artifactId>spring-social-config</artifactId></depend

django项目登录中使用图片验证码

应用下创建untils文件夹放置封装图片验证码的函数 创建validCode.py文件定义验证码规则 import random def get_random_color(): return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) def get_valid_code_img(request): # 方式: from PIL import Image, ImageDraw, ImageFon

水印、图片验证码

(貌似这个验证码不能获取,假设设置一个隐藏的label来记录又失去了他的意义) 一.水印 1.画布 System.Drawing.Image img = System.Drawing.Image.FromStream(FileUpload1.FileContent); 2.创建绘制对象,告诉它往哪张图片上绘制 Graphics g = Graphics.FromImage(img); 3.绘制的内容 string s = "www.itnba.com"; 4.绘制的字体 Font f