[oldboy-django][2深入django]登录注册页面验证码
后台生成随机验证码
#验证码生成 - 在login.html 中有一张验证码图片
设置图片的src url, 相当于发送一次get请求,返回的内容为图片渲染的内容 <div class="col-sm-5">
<input type="password" class="form-control" id="inputPassword3" placeholder="验证码">
</div>
<div class="col-sm-5">
<img src="/check_code/" width="150px" height="34px" title="点击刷新验证码">
</div> - 随机生成图片内容 def check_code(request):
from PIL import Image,ImageDraw
from io import BytesIO
f = BytesIO() # 从内存开辟一段空间
img = Image.new(mode="RGB", size=(150,34), color=(255, 255, 255))
draw = ImageDraw.Draw(img, mode='RGB') # 设置图片文本的字体
from PIL import ImageFont
font = ImageFont.truetype("kumo.ttf", 25) #7 往图片添加内容设置每个字符不同的颜色
import random
code_list = []
for i in range(5):
char = chr(random.randint(65,90))
code_list.append(char)
draw.text((i*20,10), char,
fill=(random.randint(0,255),random.randint(0,255),random.randint(0,255)),
font = font
)
# 添加内容结束
img.save(f,'png') # 图片内容保存到内存中
data = f.getvalue() # 读取图片内容
return HttpResponse(data)
将验证码保存在session, 用户提交验证码和session的验证码进行比较,完成验证码的验证
- 将验证码保存在session,用来记住用户。以便后面的验证码验证
code = "".join(code_list)
request.session["code"] = code - login验证码验证
def login(request):
if request.method == 'GET':
return render(request, 'login.html')
else:
input_code = request.POST.get("code")
session_code = request.session.get('code')
if input_code.upper() == session_code.upper():
return HttpResponse("code is correct")
else:
return HttpResponse("code is invalid")
将验证码封装
- 验证码封装
import random
from PIL import (Image,ImageDraw,ImageFont,ImageFilter) def check_code(width=120, height=30, char_length=5, font_file='kumo.ttf', font_size=28):
code = []
img = Image.new(mode='RGB', size=(width, height), color=(255, 255, 255))
draw = ImageDraw.Draw(img, mode='RGB') def rndChar():
"""生成随机字母 :return:
"""
return chr(random.randint(65, 90)) def rndColor():
"""生成随机颜色:return:
"""
return (random.randint(0, 255), random.randint(10, 255), random.randint(64, 255))
# 写文字
font = ImageFont.truetype(font_file, font_size)
for i in range(char_length):
char = rndChar()
code.append(char)
h = random.randint(0, 4)
draw.text([i * width / char_length, h], char, font=font, fill=rndColor()) # 写干扰点
for i in range(40):
draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor()) # 写干扰圆圈
for i in range(40):
draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor())
x = random.randint(0, width)
y = random.randint(0, height)
draw.arc((x, y, x + 4, y + 4), 0, 90, fill=rndColor()) # 画干扰线
for i in range(5):
x1 = random.randint(0, width)
y1 = random.randint(0, height)
x2 = random.randint(0, width)
y2 = random.randint(0, height)
draw.line((x1, y1, x2, y2), fill=rndColor()) img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)
return img, ''.join(code)
获取验证码后台视图
# 封装后的使用 def checkout(request):
from io import BytesIO
from utils.checkCode import check_code
img, code = check_code()
stream = BytesIO()
img.save(stream, 'png')
request.session['code'] = code
return HttpResponse(stream.getvalue())
# 验证码生成, 如何使用PIL
https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00140767171357714f87a053a824ffd811d98a83b58ec13000
[oldboy-django][2深入django]登录注册页面验证码的更多相关文章
- 登录注册页面html模版
登录注册页面html模版 地址:http://download.csdn.net/detail/xiaosongaixiaoqian/5432033
- /*用户登录注册页面输入框的设置*/<span>的使用
<!DOCTYPE html> /*用户登录注册页面输入框的设置*/ <html lang="en"> <head> <meta char ...
- SpringBoot 拦截器--只允许进入登录注册页面,没登录不允许查看其它页面
SpringBoot注册登录(一):User表的设计点击打开链接 SpringBoot注册登录(二):注册---验证码kaptcha的实现点击打开链接 SpringBoot注册登录(三):注册--验证 ...
- php登录注册页面及加载
php注册界面 <h1>注册页面</h1> <form acti ...
- php做登录注册页面及加载
//SQL注入攻击 //1.过滤用户的输入 //2.使用预处理语句 //3.写代码的时候尽量避免 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1. ...
- node.js实现简单的登录注册页面
首先需要新建四个文件 一个服务器js 一个保存数据的txt 一个登陆.一个注册页面html 1.注册页面 <!DOCTYPE html> <html lang="en&qu ...
- javaWeb登录注册页面
简单的登陆注册页面 1.配置JDBC驱动连接数据库 2. 配置struts2框架 3. 利用1 2完成登录页面, 注意做到不耦合,即servlet Api和控制器完全脱离) 4. 利用1 2 制作注册 ...
- HTML登录注册页面简单实现
github:传送门 , 码云: 传送门 效果参考: 登录页面,注册页面 使用了bootstrap,jQuery. 后端使用的CGI处理表单,存入MySQL数据库.(之后更新) 登录页面源码 < ...
- php+ajax 登录注册页面
主要是登录注册功能,前端后台验证没有什么,这个大家可以自己加上去,比如过滤啊,正则啊等 还是先放图吧 这是登录及注册界面 点击注册切换到注册界面,点击登录切换到登录界面 <!DOCTYPE h ...
随机推荐
- Js面向对象之观察者模式
//模拟一个目标可能拥有的一些列依赖 function ObserverList() { this.observerList = []; }; //添加一个观察者 ObserverList.proto ...
- 一次对真实网站的SQL注入———SQLmap使用
网上有许多手工注入SQL的例子和语句,非常值得我们学习,手工注入能让我们更加理解网站和数据库的关系,也能明白为什么利用注入语句能发现网站漏洞. 因为我是新手,注入语句还不太熟悉,我这次是手注发现的注点 ...
- BZOJ 2502: 清理雪道
BZOJ 2502: 清理雪道 标签(空格分隔): OI-BZOJ OI-最小流 OI-上下界网络流 Time Limit: 10 Sec Memory Limit: 128 MB Descripti ...
- jq中append(),appendTo(),after(),before(),prepend(),prependTo()的用法
1. append():往当前元素的内部的后面追加元素; eg:$("div").append($("span")); 将span放在div内部的后面. 2. ...
- [solr 管理界面] - 索引数据删除
删除solr索引数据,使用XML有两种写法: 1) <delete><id>1</id></delete> <commit/> 2) < ...
- React后台管理系统-用户列表页面
1.页面的结构 //遍历list, 返回数据 let listBody= this.state.list.map((user,index)=> { return ...
- iOS进阶面试题
1. 风格纠错题 修改完的代码: 修改方法有很多种,现给出一种做示例: // .h文件 // http://weibo.com/luohanchenyilong/ // https://github. ...
- Express session的使用
进行session存储时需引用中间件,app.js var express=require('express'); var app=express(); var cookieParser = requ ...
- Oracle10g安装过程中的Configuration Assistant配置失败的问题。
前几天安装Oracle的时候碰到了一个小问题,是在最后配置的时候,出现失败提示如下 失败提示:一些 Configuration Assistant 失败.强烈建议您此时重试这些 Configurati ...
- Python小项目之五子棋
1.项目简介 在刚刚学习完python套接字的时候做的一个五子棋小游戏,可以在局域网内双人对战,也可以和电脑对战 2.实现思路 局域网对战 对于局域网功能来说,首先建立连接(tcp),然后每次下棋时将 ...