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网络编程之读取网站根目录实例
Sep 30 Python
python实现简单的socket server实例
Apr 29 Python
Python+Turtle动态绘制一棵树实例分享
Jan 16 Python
python 创建一个空dataframe 然后添加行数据的实例
Jun 07 Python
Python使用sorted对字典的key或value排序
Nov 15 Python
Python设计模式之原型模式实例详解
Jan 18 Python
使用Python+wxpy 找出微信里把你删除的好友实例
Feb 21 Python
Python后台开发Django的教程详解(启动)
Apr 08 Python
Django model update的多种用法介绍
Mar 28 Python
Python3 把一个列表按指定数目分成多个列表的方式
Dec 25 Python
利用django model save方法对未更改的字段依然进行了保存
Mar 28 Python
Django用户身份验证完成示例代码
Apr 03 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实现将多个文件中的内容合并为新文件的方法示例
2017/06/10 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
Nginx+php配置文件及原理解析
2020/12/09 PHP
FireFox JavaScript全局Event对象
2009/06/14 Javascript
javascript 文件的同步加载与异步加载实现原理
2012/12/13 Javascript
PHP abstract与interface之间的区别
2013/11/11 Javascript
异步安全加载javascript文件的方法
2015/07/21 Javascript
js变形金刚文字特效代码分享
2015/08/20 Javascript
JS实现的简单鼠标跟随DiV层效果完整实例
2015/10/31 Javascript
js图片上传前预览功能(兼容所有浏览器)
2016/08/24 Javascript
jQuery实现IE输入框完成placeholder标签功能的方法
2017/09/20 jQuery
详解http访问解析流程原理
2017/10/18 Javascript
Ionic学习日记实现验证码倒计时
2018/02/08 Javascript
JavaScript学习笔记之DOM操作实例分析
2019/01/08 Javascript
Vue中util的工具函数实例详解
2019/07/08 Javascript
Vue分页效果与购物车功能
2019/12/13 Javascript
JavaScript面试中常考的字符串操作方法大全(包含ES6)
2020/05/10 Javascript
Python实现的检测网站挂马程序
2014/11/30 Python
Python文件和流(实例讲解)
2017/09/12 Python
python删除过期log文件操作实例解析
2018/01/31 Python
django1.11.1 models 数据库同步方法
2018/05/30 Python
利用Python求阴影部分的面积实例代码
2018/12/05 Python
Python不同目录间进行模块调用的实现方法
2019/01/29 Python
python3 深浅copy对比详解
2019/08/12 Python
Python实现语音识别和语音合成功能
2019/09/20 Python
python写一个随机点名软件的实例
2019/11/28 Python
python绘制动态曲线教程
2020/02/24 Python
python两种获取剪贴板内容的方法
2020/11/06 Python
html5指南-3.如何实现html元素拖拽功能
2013/01/07 HTML / CSS
台湾百利市购物中心:e-Payless
2017/08/16 全球购物
优秀应届毕业生自荐信
2013/11/16 职场文书
安全责任书范文
2014/03/12 职场文书
工业设计专业自荐书
2014/06/05 职场文书
2015年市场部工作总结
2015/04/30 职场文书
2015年清剿火患专项行动工作总结
2015/07/27 职场文书
工程移交协议书
2016/03/24 职场文书