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的循环体中使用else语句的方法
Mar 30 Python
Java多线程编程中ThreadLocal类的用法及深入
Jun 21 Python
人工智能最火编程语言 Python大战Java!
Nov 13 Python
python实现将多个文件分配到多个文件夹的方法
Jan 07 Python
在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例
Jan 29 Python
解决Pandas的DataFrame输出截断和省略的问题
Feb 08 Python
利用Python对文件夹下图片数据进行批量改名的代码实例
Feb 21 Python
python-视频分帧&amp;多帧合成视频实例
Dec 10 Python
PyCharm如何导入python项目的方法
Feb 06 Python
Python + selenium + crontab实现每日定时自动打卡功能
Mar 31 Python
深入分析python 排序
Aug 24 Python
Python编写车票订购系统 Python实现快递收费系统
Aug 14 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实现短域名互转
2013/07/05 PHP
PHP开发框架kohana3 自定义路由设置示例
2014/07/14 PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
2015/04/21 PHP
Smarty模板引擎缓存机制详解
2016/05/23 PHP
Zend Framework过滤器Zend_Filter用法详解
2016/12/09 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
2018/06/16 PHP
一段非常简单的让图片自动切换js代码
2006/11/10 Javascript
js网页版计算器的简单实现
2013/07/02 Javascript
jquery 实现密码框的显示与隐藏示例代码
2013/09/18 Javascript
Firefox和IE兼容性问题及解决方法总结
2013/10/08 Javascript
nodejs 实现模拟form表单上传文件
2014/07/14 NodeJs
javascript检查浏览器是否支持flash的实现代码
2014/08/14 Javascript
JavaScript indexOf方法入门实例(计算指定字符在字符串中首次出现的位置)
2014/10/17 Javascript
JS+Canvas 实现下雨下雪效果
2016/05/18 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
2016/10/10 Javascript
js实现上传文件添加和删除文件选择框
2016/10/24 Javascript
ES6新特性六:promise对象实例详解
2017/04/21 Javascript
React.Js添加与删除onScroll事件的方法详解
2017/11/03 Javascript
layui内置模块layim发送图片添加加载动画的方法
2019/09/23 Javascript
JavaScript检测是否开启了控制台(F12调试工具)
2020/10/02 Javascript
Python导入模块时遇到的错误分析
2017/08/30 Python
使用python获取csv文本的某行或某列数据的实例
2018/04/03 Python
Python3处理HTTP请求的实例
2018/05/10 Python
python+Splinter实现12306抢票功能
2018/09/25 Python
Python中生成一个指定长度的随机字符串实现示例
2019/11/06 Python
Python 实现Serial 与STM32J进行串口通讯
2019/12/18 Python
HTML5 Canvas渐进填充与透明实现图像的Mask效果
2013/07/11 HTML / CSS
网购亚洲时装、美容产品和生活百货:YesStyle
2016/09/15 全球购物
军训自我鉴定范文
2014/02/13 职场文书
中式结婚主持词
2014/03/14 职场文书
语文教研活动总结
2014/07/02 职场文书
毕业生就业推荐表导师评语
2014/12/31 职场文书
离婚代理词范文
2015/05/23 职场文书
男生贾里读书笔记
2015/06/30 职场文书
党员转正大会主持词
2015/07/02 职场文书
诺贝尔奖获得者名言100句:句句启人心智,值永久收藏
2019/08/09 职场文书