Django 生成登陆验证码代码分享


Posted in Python onDecember 12, 2017

环境准备

python3.52
pycharm5.05
Pillow

自制的验证码工具包/utils/check_code

验证码的作用

防恶意破解密码:防止,使用程序或机器人恶意去试密码.为了提高用户的体验,用户输入错误以后,才会要求输入验证码.

防论坛灌水:这个是很常见的。有一种程序叫做顶帖机,如果无限制的刷,整个论坛可能到处是拉圾信息,比如,百度贴吧,你只要是新用户或者刚刚关注的贴吧,要是发帖,会马上出现验证码。

有效防止注册,以防,使用程序或机器人去无限制注册账号.

防刷票,网上有很多投票类的网站.

2.验证码的原理

验证码于服务器端生成,发送给客户端,并以图像格式显示。客户端提交所显示的验证码,客户端接收并进行比较,若比对失败则不能实现登录或注册,反之成功后跳转相应界面。

实现

生成验证码
点击可刷新

代码:

注意: 配置setting.py ; 创建数据库!

/utils/check_code

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import random
from PIL import Image, ImageDraw, ImageFont, ImageFilter
_letter_cases = "abcdefghjkmnpqrstuvwxy" # 小写字母,去除可能干扰的i,l,o,z
_upper_cases = _letter_cases.upper() # 大写字母
_numbers = ''.join(map(str, range(3, 10))) # 数字
init_chars = ''.join((_letter_cases, _upper_cases, _numbers))
def create_validate_code(size=(120, 30),
       chars=init_chars,
       img_type="GIF",
       mode="RGB",
       bg_color=(238,99,99),
       fg_color=(0, 0, 255),
       font_size=18,
       font_type="Monaco.ttf",
       length=4,
       draw_lines=True,
       n_line=(1, 2),
       draw_points=True,
       point_chance=2):
 """
 @todo: 生成验证码图片
 @param size: 图片的大小,格式(宽,高),默认为(120, 30)
 @param chars: 允许的字符集合,格式字符串
 @param img_type: 图片保存的格式,默认为GIF,可选的为GIF,JPEG,TIFF,PNG
 @param mode: 图片模式,默认为RGB
 @param bg_color: 背景颜色,默认为白色
 @param fg_color: 前景色,验证码字符颜色,默认为蓝色#0000FF
 @param font_size: 验证码字体大小
 @param font_type: 验证码字体,默认为 ae_AlArabiya.ttf
 @param length: 验证码字符个数
 @param draw_lines: 是否划干扰线
 @param n_lines: 干扰线的条数范围,格式元组,默认为(1, 2),只有draw_lines为True时有效
 @param draw_points: 是否画干扰点
 @param point_chance: 干扰点出现的概率,大小范围[0, 100]
 @return: [0]: PIL Image实例
 @return: [1]: 验证码图片中的字符串
 """
 width, height = size # 宽高
 # 创建图形
 img = Image.new(mode, size, bg_color)
 draw = ImageDraw.Draw(img) # 创建画笔
 def get_chars():
  """生成给定长度的字符串,返回列表格式"""
  return random.sample(chars, length)
 def create_lines():
  """绘制干扰线"""
  line_num = random.randint(*n_line) # 干扰线条数
  for i in range(line_num):
   # 起始点
   begin = (random.randint(0, size[0]), random.randint(0, size[1]))
   # 结束点
   end = (random.randint(0, size[0]), random.randint(0, size[1]))
   draw.line([begin, end], fill=(0, 0, 0))
 def create_points():
  """绘制干扰点"""
  chance = min(100, max(0, int(point_chance))) # 大小限制在[0, 100]
  for w in range(width):
   for h in range(height):
    tmp = random.randint(0, 100)
    if tmp > 100 - chance:
     draw.point((w, h), fill=(0, 0, 0))
 def create_strs():
  """绘制验证码字符"""
  c_chars = get_chars()
  strs = ' %s ' % ' '.join(c_chars) # 每个字符前后以空格隔开
  font = ImageFont.truetype(font_type, font_size)
  font_width, font_height = font.getsize(strs)

  draw.text(((width - font_width) / 3, (height - font_height) / 3),
     strs, font=font, fill=fg_color)

  return ''.join(c_chars)
 if draw_lines:
  create_lines()
 if draw_points:
  create_points()
 strs = create_strs()
 # 图形扭曲参数
 params = [1 - float(random.randint(1, 2)) / 100,
    0,
    0,
    0,
    1 - float(random.randint(1, 10)) / 100,
    float(random.randint(1, 2)) / 500,
    0.001,
    float(random.randint(1, 2)) / 500
    ]
 img = img.transform(size, Image.PERSPECTIVE, params) # 创建扭曲
 img = img.filter(ImageFilter.EDGE_ENHANCE_MORE) # 滤镜,边界加强(阈值更大)
 return img, strs

urls.py

from django.conf.urls import url
from django.contrib import admin
from web import views
urlpatterns = [
 url(r'^admin/', admin.site.urls),
 url(r'^yzhome.html',views.yz_home ),
 url(r'^yanzheng.html',views.yanzheng ),
]

views.py

from django.shortcuts import render
from django.shortcuts import HttpResponse
from utils.check_code import create_validate_code
from django.shortcuts import redirect
from io import BytesIO
# Create your views here.

def yz_home(requset):
 if requset.method=='GET':
  return render(requset,'yz_home.html')
 else:
  return HttpResponse('ok')
def yanzheng(requset):
 f=BytesIO()
 img,code=create_validate_code()
 requset.session['check_code']=code
 img.save(f,'PNG')
 return HttpResponse(f.getvalue())

/templates/yz_home.html

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>验证码</title>
</head>
<body>
<form action="yz_home.html" method="POST">
<div> 用户名:<input type="text" placeholder="用户名" name="username"></div>
<div>密码:<input type="password" placeholder="密码" name="pwa"></div>
<div>验证码:<input type="text" name="yzm"></div>
<img src="/yanzheng.html" onclick="shuaxin(this);">
<div><input type="submit" value="确认"></div>
 <script src="/static/js/jquery-1.12.4.js">
 </script>
 <script>
  function shuaxin(ths){
{#    ths.src = ths.src + "?"#} 
   var i =$(ths).prop("src")
    $(ths).prop("src",i+"?")
  }
 </script>
</form>
</body>
</html>

效果图

Django 生成登陆验证码代码分享

知识点总结:

<img src="/yanzheng.html" onclick="shuaxin(this);">
 <script>
  function shuaxin(ths){
   ths.src = ths.src + "?" 
  }
 </script>

=

<img src="/yanzheng.html" onclick="shuaxin(this);">
 <script src="/static/js/jquery-1.12.4.js">
 </script>
 <script>
  function shuaxin(ths){
   var i =$(ths).prop("src")
    $(ths).prop("src",i+"?")

  }
 </script>

jQueryObject.prop( propertyName [, value ] )
设置或返回指定属性propertyName的值。如果指定了value参数,则表示设置属性propertyName的值为value;如果没有指定value参数,则表示返回属性propertyName的值。

总结

以上就是本文关于Django 生成登陆验证码代码分享的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
python实现用于测试网站访问速率的方法
May 26 Python
关于Python 3中print函数的换行详解
Aug 08 Python
Python配置mysql的教程(推荐)
Oct 13 Python
Python语言描述机器学习之Logistic回归算法
Dec 21 Python
Python通过OpenCV的findContours获取轮廓并切割实例
Jan 05 Python
Python实现接受任意个数参数的函数方法
Apr 21 Python
Tensorflow加载预训练模型和保存模型的实例
Jul 27 Python
Python读取mat文件,并保存为pickle格式的方法
Oct 23 Python
对pytorch网络层结构的数组化详解
Dec 08 Python
解决Django transaction进行事务管理踩过的坑
Apr 24 Python
从np.random.normal()到正态分布的拟合操作
Jun 02 Python
Python装饰器的练习题
Nov 23 Python
python+django加载静态网页模板解析
Dec 12 #Python
Django入门使用示例
Dec 12 #Python
django使用html模板减少代码代码解析
Dec 12 #Python
Python使用三种方法实现PCA算法
Dec 12 #Python
Java分治归并排序算法实例详解
Dec 12 #Python
Python数据结构与算法之二叉树结构定义与遍历方法详解
Dec 12 #Python
Python数据结构与算法之图的基本实现及迭代器实例详解
Dec 12 #Python
You might like
网站加速 PHP 缓冲的免费实现方法
2006/10/09 PHP
PHP代码优化的53个细节
2014/03/03 PHP
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
2015/06/17 PHP
Firebug入门指南(Firefox浏览器)
2010/08/21 Javascript
理解Javascript_10_对象模型
2010/10/16 Javascript
JQuery获取当前屏幕的高度宽度的实现代码
2011/07/12 Javascript
JQuery入门——用映射方式绑定不同事件应用示例
2013/02/05 Javascript
不要使用jQuery触发原生事件的方法
2014/03/03 Javascript
jquery mobile动态添加元素之后不能正确渲染解决方法说明
2014/03/05 Javascript
分享一款基于jQuery的视频播放插件
2014/10/09 Javascript
javascript将数字转换整数金额大写的方法
2015/01/27 Javascript
使用CDN和AJAX加速WordPress中jQuery的加载
2015/12/05 Javascript
一波JavaScript日期判断脚本分享
2016/03/06 Javascript
Vue2.0实现购物车功能
2017/06/05 Javascript
JavaScript 程序错误Cannot use 'in' operator to search的解决方法
2017/07/10 Javascript
把JavaScript代码改成ES6语法不完全指南(分享)
2017/09/10 Javascript
vue实现一拉到底的滑动验证
2019/07/25 Javascript
vue+element项目中过滤输入框特殊字符小结
2019/08/07 Javascript
Javascript查看大图功能代码实现
2020/05/07 Javascript
浅谈鸿蒙 JavaScript GUI 技术栈
2020/09/17 Javascript
js实现详情页放大镜效果
2020/10/28 Javascript
浅谈JSON5解决了JSON的两大痛点
2020/12/14 Javascript
使用Python脚本来控制Windows Azure的简单教程
2015/04/16 Python
python实现简易云音乐播放器
2018/01/04 Python
Python之reload流程实例代码解析
2018/01/29 Python
VScode编写第一个Python程序HelloWorld步骤
2018/04/06 Python
python 通过类中一个方法获取另一个方法变量的实例
2019/01/22 Python
Python企业编码生成系统之主程序模块设计详解
2019/07/26 Python
RIP版本1跟版本2的区别
2013/12/30 面试题
党员对照检查材料
2014/09/22 职场文书
重阳节演讲稿:尊敬帮助老人 弘扬传统美德
2014/09/25 职场文书
留学推荐信英文范文
2015/03/26 职场文书
中秋晚会致辞
2015/07/31 职场文书
php TP5框架生成二维码链接
2021/04/01 PHP
python实现高效的遗传算法
2021/04/07 Python
MySQL中几种插入和批量语句实例详解
2021/09/14 MySQL