前言

网站登录的时候我们常常会看到随机的验证码需要输入后台验证,如图:
现在我们来实现在Django中通过自定制插件来实现随机验证
check_code.py
基于PIL生成一个带验证码的图片和验证码,生成验证码图片需要Monaco.ttf字体(重要),可按自己要求更改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=(255, 255, 255),
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和views
views.py:
# 将check_code包放在合适的位置,导入即可,我是放在utils下面 from utils import check_code def create_code_img(request): f = BytesIO() #直接在内存开辟一点空间存放临时生成的图片 img, code = check_code.create_validate_code() #调用check_code生成照片和验证码 request.session['check_code'] = code #将验证码存在服务器的session中,用于校验 img.save(f,'PNG') #生成的图片放置于开辟的内存中 return HttpResponse(f.getvalue()) #将内存的数据读取出来,并以HttpResponse返回
urls我的设置:url(r'^create_code_img/', views.create_code_img)
前端应用验证码和点击自动刷新
html:
<div class="row">
<div class="col-xs-7">
<input type="text" class="form-control" name="check_code" id="check_code" placeholder="请输入验证码">
</div>
<div class="col-xs-5">
<img id="check_code_img" src="/create_code_img/" onclick="refresh_check_code(this)">
{# src是url路径,可得到验证码图片,点击时调用refresh_check_code#}
</div><br></div>
javascript:
<script>
function refresh_check_code(ths) {
ths.src += '?';
{# src后面加问好会自动刷新验证码img的src#}
}
</script>
login的Views
login的Views进行数据验证,然后做相应的处理
post_check_code = request.POST.get('check_code')
session_check_code = request.session['check_code']
if post_check_code.lower() == session_check_code.lower() :
pass
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Django
# 登录
# 验证码
# django 发送手机验证码的示例代码
# Django 生成登陆验证码代码分享
# Django验证码的生成与使用示例
# python django 实现验证码的功能实例代码
# Django中使用pillow实现登录验证码功能(带刷新验证码功能)
# 默认为
# 放在
# 来实现
# 滤镜
# 我是
# 更大
# 请输入
# 可选
# 如图
# 并以
# 可按
# 常常会
# 大家多多
# 条数
# 可得到
# 网站登录
# 前景色
# 起始点
# fg_color
相关文章:
代购小票制作网站有哪些,购物小票的简要说明?
网站制作话术技巧,网站推广做的好怎么话术?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
建站之星如何快速解决建站难题?
如何在IIS中配置站点IP、端口及主机头?
青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?
代刷网站制作软件,别人代刷火车票靠谱吗?
长沙做网站要多少钱,长沙国安网络怎么样?
c# Task.ConfigureAwait(true) 在什么场景下是必须的
如何用VPS主机快速搭建个人网站?
建站之星会员如何解锁更多建站功能?
想学网站制作怎么学,建立一个网站要花费多少?
网站制作模板下载什么软件,ppt模板免费下载网站?
Swift开发中switch语句值绑定模式
电脑免费海报制作网站推荐,招聘海报哪个网站多?
公司网站设计制作厂家,怎么创建自己的一个网站?
企业微网站怎么做,公司网站和公众号有什么区别?
如何快速配置高效服务器建站软件?
定制建站是什么?如何实现个性化需求?
已有域名如何快速搭建专属网站?
桂林网站制作公司有哪些,桂林马拉松怎么报名?
如何通过服务器快速搭建网站?完整步骤解析
如何在万网自助建站中设置域名及备案?
如何快速重置建站主机并恢复默认配置?
建站之星后台密码遗忘如何找回?
如何在腾讯云免费申请建站?
已有域名和空间如何搭建网站?
网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?
建站之星安全性能如何?防护体系能否抵御黑客入侵?
高防服务器租用如何选择配置与防御等级?
建站之星安装后界面空白如何解决?
如何用AWS免费套餐快速搭建高效网站?
如何选择高效响应式自助建站源码系统?
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
建设网站制作价格,怎样建立自己的公司网站?
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
如何在建站之星绑定自定义域名?
制作销售网站教学视频,销售网站有哪些?
武清网站制作公司,天津武清个人营业执照注销查询系统网站?
如何在IIS7上新建站点并设置安全权限?
行程制作网站有哪些,第三方机票电子行程单怎么开?
建站上市公司网站建设方案与SEO优化服务定制指南
正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?
较简单的网站制作软件有哪些,手机版网页制作用什么软件?
招商网站制作流程,网站招商广告语?
打鱼网站制作软件,波克捕鱼官方号怎么注册?
公司网站的制作公司,企业网站制作基本流程有哪些?
制作充值网站的软件,做人力招聘为什么要自己交端口钱?
如何在阿里云购买域名并搭建网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。