后台生成随机验证码

#验证码生成

    - 在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]登录注册页面验证码的更多相关文章

  1. 登录注册页面html模版

    登录注册页面html模版 地址:http://download.csdn.net/detail/xiaosongaixiaoqian/5432033

  2. /*用户登录注册页面输入框的设置*/<span>的使用

    <!DOCTYPE html> /*用户登录注册页面输入框的设置*/ <html lang="en"> <head> <meta char ...

  3. SpringBoot 拦截器--只允许进入登录注册页面,没登录不允许查看其它页面

    SpringBoot注册登录(一):User表的设计点击打开链接 SpringBoot注册登录(二):注册---验证码kaptcha的实现点击打开链接 SpringBoot注册登录(三):注册--验证 ...

  4. php登录注册页面及加载

                           php注册界面                               <h1>注册页面</h1> <form acti ...

  5. php做登录注册页面及加载

    //SQL注入攻击 //1.过滤用户的输入 //2.使用预处理语句 //3.写代码的时候尽量避免 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1. ...

  6. node.js实现简单的登录注册页面

    首先需要新建四个文件 一个服务器js 一个保存数据的txt 一个登陆.一个注册页面html 1.注册页面 <!DOCTYPE html> <html lang="en&qu ...

  7. javaWeb登录注册页面

    简单的登陆注册页面 1.配置JDBC驱动连接数据库 2. 配置struts2框架 3. 利用1 2完成登录页面, 注意做到不耦合,即servlet Api和控制器完全脱离) 4. 利用1 2 制作注册 ...

  8. HTML登录注册页面简单实现

    github:传送门 , 码云: 传送门 效果参考: 登录页面,注册页面 使用了bootstrap,jQuery. 后端使用的CGI处理表单,存入MySQL数据库.(之后更新) 登录页面源码 < ...

  9. php+ajax 登录注册页面

    主要是登录注册功能,前端后台验证没有什么,这个大家可以自己加上去,比如过滤啊,正则啊等 还是先放图吧 这是登录及注册界面  点击注册切换到注册界面,点击登录切换到登录界面 <!DOCTYPE h ...

随机推荐

  1. C#之linq

    本文根据30分钟LINQ教程学习作的笔记. 1.Guid.Empty Guid 结构: 表示全局唯一标识符 (GUID).Empty字段:Guid 结构的只读实例,其值均为零.用来设置初始值.   G ...

  2. 用rem实现h5页面的编写

    一 静态页面的布局 将这段代码加到script中 (function(doc, win) { var docEl = doc.documentElement, resizeEvt = 'orienta ...

  3. Liunx开发(Extjs4.1+desktop+SSH2超强视频教程实践)(2)

    然后装eclipse: 为啥默认是搜狗导航: java还没装呢: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downlo ...

  4. 使用OpenFileDialog组件打开对话框

    实现效果: 知识运用: OpenFileDialog组件的ShowDialog方法 public DialogResult Show () //返回枚举值 DialogRrsult.OK  或  Di ...

  5. CentOS替换系统自带JDK

    1.解压jdk安装包到/opt 下 /opt/jdk1.8.0_181 2.编辑/etc/profile, 增加如下内容 export JAVA_HOME=/opt/jdk1.8.0_181expor ...

  6. SyntaxHighlighter使用方法

    原名:SyntaxHighlighter,是一款用于web页面的代码着色工具,可以用来着色多种语言,可以是HTML,CSS,Javascript,还可以是C,JAVA等编程语言.最早见于Yahoo的Y ...

  7. checkbox 最多选两项

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  8. Mybatis自查询递归查找子

    先看一下数据库 主键id,名称product_code,父parent,和kind 设计菜单类 setter,getter Dao public interface ProductMapper { L ...

  9. d3.js--01

    D3 的全称是(Data-Driven Documents),顾名思义可以知道是一个被数据驱动的文档.听名字有点抽象,说简单一点,其实就是一个 JavaScript 的函数库,使用它主要是用来做数据可 ...

  10. http请求中客户端真实的ip

    private String getRemoteAddr() { String ip = ""; String unknow = "unknown"; try ...