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文档生成工具pydoc使用介绍
Jun 02 Python
PyQt5每天必学之QSplitter实现窗口分隔
Apr 19 Python
PyQt5 窗口切换与自定义对话框的实例
Jun 20 Python
python输出电脑上所有的串口名的方法
Jul 02 Python
python线程的几种创建方式详解
Aug 29 Python
Python3实现二叉树的最大深度
Sep 30 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
Feb 25 Python
pandas中的ExcelWriter和ExcelFile的实现方法
Apr 24 Python
Keras预训练的ImageNet模型实现分类操作
Jul 07 Python
Python中过滤字符串列表的方法
Dec 22 Python
Python Django获取URL中的数据详解
Nov 01 Python
Python可变与不可变数据和深拷贝与浅拷贝
Apr 06 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
PHPlet在Windows下的安装
2006/10/09 PHP
浅析php fwrite写入txt文件的时候用 \r\n不能换行的问题
2013/08/06 PHP
Destoon旺旺无法正常显示,点击提示“会员名不存在”的解决办法
2014/06/21 PHP
thinkPHP框架动态配置用法实例分析
2018/06/14 PHP
JavaScript基础知识之数据类型
2012/08/06 Javascript
使用javascript创建快捷方式的简单实例
2013/08/09 Javascript
jquery重复提交请求的原因浅析
2014/05/23 Javascript
jQuery实现TAB风格的全国省份城市滑动切换效果代码
2015/08/24 Javascript
JavaScript实现复制内容到粘贴板代码
2016/03/31 Javascript
jQuery对象的链式操作用法分析
2016/05/10 Javascript
Vue.Draggable实现拖拽效果
2020/07/29 Javascript
基于Bootstrap表单验证功能
2017/11/17 Javascript
jQuery+koa2实现简单的Ajax请求的示例
2018/03/06 jQuery
微信小程序常用简易小函数总结
2019/02/01 Javascript
D3.js(v3)+react 实现带坐标与比例尺的散点图 (V3版本)
2019/05/09 Javascript
JS运算符简单用法示例
2020/01/19 Javascript
vue用ant design中table表格,点击某行时触发的事件操作
2020/10/28 Javascript
Python中实现对Timestamp和Datetime及UTC时间之间的转换
2015/04/08 Python
python中os模块详解
2016/10/14 Python
Python实现的多项式拟合功能示例【基于matplotlib】
2018/05/15 Python
Python获取时间范围内日期列表和周列表的函数
2019/08/05 Python
套娃式文件夹如何通过Python批量处理
2020/08/23 Python
西班牙品牌鞋子、服装和配饰在线商店:Esdemarca
2021/02/17 全球购物
利达恒信公司.NET笔试题面试题
2016/03/05 面试题
如何进行Linux分区优化
2013/02/12 面试题
师范毕业生自荐信
2013/10/17 职场文书
毕业求职自荐信格式是什么
2013/11/19 职场文书
上班睡觉检讨书
2014/01/09 职场文书
春节晚会主持词
2014/03/24 职场文书
水利水电建筑施工应届生求职信
2014/07/04 职场文书
个人师德师风自我剖析材料
2014/09/29 职场文书
2015年教师新年寄语
2014/12/08 职场文书
确保工程质量承诺书
2015/04/29 职场文书
暑期家教宣传单
2015/07/14 职场文书
Linux服务器离线安装 nginx的详细步骤
2022/06/16 Servers
zabbix如何添加监控主机和自定义监控项
2022/08/14 Servers