ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-09-28 12:02:07  阅读:217  来源: 互联网

标签:插拔 obj 自定义 randint random 验证码 django captcha 开源


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)的方式就好了。这也是我自定义验证码功能的原因。

标签:插拔,obj,自定义,randint,random,验证码,django,captcha,开源
来源: https://www.cnblogs.com/wanghong1994/p/11602444.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有