登陆和生成图片验证码

1.生成图片 pillow

1.生成图片的模块pillow,在python中安装pillow,在Django中使用时用PIL
2. 在页面上<img id="valid-img" class="valid-img" src="/get_valid_img.png?" alt="">

2.后端处理

1.生成一个图片对象:from PIL import Image

   # 获取随机颜色的函数
def get_random_color():
return random.randint(, ), random.randint(, ), random.randint(, )
def new(mode, size, color=) 有三个参数
img_obj=Image.new(
'RGB',
(,) 图片大小
get_random_color() 返回的是元祖(,,) 图片颜色
)

2.生成的图片放在磁盘或加载到内存

.将生成的图片保存到磁盘上:
with open("s10.png","wb") as f:
img_obj.save(f,"png")
with open("s10.png","rb") as f:
data=f.read()
.将生成的图片在内存中加载
from io import BytesIO
io_obj=BytesIO()
# 将生成的图片数据保存在io对象中
img_obj.save(io_obj,'png')
# 从io对象里面取上一步保存的数据
data=io_obj.getvalue()
.将生成的图片返回到页面
return HttpResponse(data)

3.在图片上添加文本

from PIL import Image, ImageDraw, ImageFont
draw_obj = ImageDraw.Draw(img_obj) # 生成一个图片画笔对象
# # 加载字体文件, 得到一个字体对象,路径从项目的根目录下找
font_obj = ImageFont.truetype("static/font/kumo.ttf", )
##生成的字符串写到图片上draw_obj.text(x,y,l,m) x为写的位置,tmp写的文本,fill文本颜色,font文本字体
draw_obj.text(( , ), "python", fill=(, , ), font=font_obj)

4.验证码

 for i in range():
u = chr(random.randint(, )) # 生成大写字母
m = chr(random.randint(, )) # 生成小写字母
l = random.randint(, )
tmp = random.choice([u, m, l])
tmp_list += str(tmp)
print(tmp_list)

5.加干扰先和干扰点

加干扰线
width = # 图片宽度(防止越界)
height =
for i in range():
x1 = random.randint(, width)
x2 = random.randint(, width)
y1 = random.randint(, height)
y2 = random.randint(, height)
draw_obj.line((x1, y1, x2, y2), fill=get_random_color()) # 加干扰点
for i in range():
draw_obj.point((random.randint(, width), random.randint(, height)), fill=get_random_color())
x = random.randint(, width)
y = random.randint(, height)
draw_obj.arc((x, y, x+, y+), , , fill=get_random_color())

6.验证码校验

.当用户在页面上输入验证码提交后,后台要进行验证。验证码是在get_code函数中生成的
而校验实在login函数中执行的,因此需要将验证码设置为全局变量
VALID_CODE=""
def get_code():
global VALID_CODE
VALID_CODE =tmp_list
.在校验时应不区分大小写:
valid_code = request.POST.get("valid_code") # 获取用户填写的验证码
if valid_code.upper()==VALID_CODE.upper():pass
随机生成的验证码如何在后端保存
. 保存在全局变量 不行
相当于所有的请求都共用一个验证码
. 每一个请求使用一个自己生成的验证码
.保存到session中
request.session["valid_code"]=tmp_list
校验时:验证码不能为空
if valid_code and valid_code.upper()==request.session.get("valid_code","").upper():pass

7.刷新验证码

.原理:
在页面上打开一个图片,使用jquery操作
iEle=document.getElementById("i1)
iEle.src 获得图片的网址链接
给其赋个新值:iEle.src="http://www.xxsbxn"
页面不刷新,但图片更改
.刷新验证码:在src的值后面加上?,每次点击图片相当于更换图片链接
<img id="valid-img" class="valid-img" src="/get_valid_img.png?" alt="">
// 点击验证码图片 刷新验证码
$("#valid-img").click(function () {
$(this)[].src += "?";
})

登陆页面代码

'''
<div class="container">
<div class="row">
<form class="form-horizontal col-md-6 col-md-offset-3 login-form">
{% csrf_token %}
<div class="form-group">
<label for="username" class="col-sm-2 control-label">用户名</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="username" name="username" placeholder="用户名">
</div>
</div>
<div class="form-group">
<label for="password" class="col-sm-2 control-label">密码</label>
<div class="col-sm-10">
<input type="password" class="form-control" id="password" name="password" placeholder="密码">
</div>
</div>
<div class="form-group">
<label for="password" class="col-sm-2 control-label">验证码</label>
<div class="col-sm-10">
<input type="text" name="valid_code" id="valid_code">
<img id="valid-img" class="valid-img" src="/get_valid_img.png?" alt="">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="button" class="btn btn-default" id="login-button">登录</button>
<span class="login-error"></span>
</div>
</div>
</form>
</div>
</div> <script src="/static/jquery-3.3.1.js"></script>
<script src="/static/bootstrap/js/bootstrap.min.js"></script>
<script>
$("#login-button").click(function () {
// 1. 取到用户填写的用户名和密码 -> 取input框的值
var username = $("#username").val();
var password = $("#password").val();
var valid_code = $("#valid_code").val();
// 2. 用AJAX发送到服务端
$.ajax({
url: "/login/",
type: "post",
data: {
"username": username,
"password": password,
"valid_code": valid_code,
"csrfmiddlewaretoken": $("[name='csrfmiddlewaretoken']").val()
},
success: function (data) {
console.log(data);
if (data.status){
// 有错误,在页面上提示
$(".login-error").text(data.msg);
}else {
// 登陆成功
location.href = data.msg;
}
}
})
}); // 当input框获取焦点时将之前的错误清空
$("#username,#password").focus(function () {
// 将之前的错误清空
$(".login-error").text("");
});
// 点击验证码图片 刷新验证码
$("#valid-img").click(function () {
$(this)[].src += "?";
})
</script> '''

HTML

'''
def login(request):
# if request.is_ajax(): # 如果是AJAX请求
if request.method == "POST":
# 初始化一个给AJAX返回的数据
ret = {"status": , "msg": ""}
# 从提交过来的数据中 取到用户名和密码
username = request.POST.get("username")
pwd = request.POST.get("password")
valid_code = request.POST.get("valid_code") # 获取用户填写的验证码
print(valid_code)
print("用户输入的验证码".center(, "="))
if valid_code and valid_code.upper() == request.session.get("valid_code", "").upper():
# 验证码正确
# 利用auth模块做用户名和密码的校验
user = auth.authenticate(username=username, password=pwd)
if user:
# 用户名密码正确
# 给用户做登录
auth.login(request, user)
ret["msg"] = "/index/"
else:
# 用户名密码错误
ret["status"] =
ret["msg"] = "用户名或密码错误!"
else:
ret["status"] =
ret["msg"] = "验证码错误" return JsonResponse(ret)
return render(request, "login.html") '''

Views

简单BBS项目开始(二)的更多相关文章

  1. BBS项目(二)

    目录 BBS项目(二) ORM 创建相关表 表模型 修改admin样式 Simple-UI 注册表添加数据 注册forms类编写 注册功能前端搭建 头像实时显示功能实现 BBS项目(二) 可以在本地写 ...

  2. 简单BBS项目开始(一)

    1.BBS需求分析和创建ORM 1. 需要哪些表 1. UserInfo 1. username 2. password 3. avatar #头像图片 2. 文章表: title publish_d ...

  3. Ant—使用Ant构建简单Java项目(三)

    博客<Ant-使用Ant构建简单Java项目(二)>我们简化了运行Test类中main方法须要运行的命令,本博客来介绍一下如何使build.xml文件和当中使用property标签定义的属 ...

  4. BBS项目分布搭建二(个人站点相关)

    BBS项目分布搭建二 1. 首页详情补充 # 在home.html文件中 body标签内补充: <div class="container-fluid"> <di ...

  5. 简单创建一个SpringCloud2021.0.3项目(二)

    目录 1. 项目说明 1. 版本 2. 用到组件 3. 功能 2. 上一篇教程 3. 创建公共模块Common 4. 网关Gateway 1. 创建Security 2. Security登陆配置 3 ...

  6. BBS项目知识点汇总

    目录 bbs项目知识点汇总 一. JavaScript 1 替换头像 2 form表单拿数据 3 form组件error信息渲染 4 添加html代码 5 聚焦操作 二 . html在线编辑器 三 . ...

  7. 小福bbs——项目需求分析

    # 一.简单了解 这个作业属于哪个课程 班级链接 这个作业要求在哪里 作业要求的链接 团队名称 小福bbs 这个作业的目标 第一个版本,根据项目预期情况形成 作业的正文 小福bbs--项目需求分析 其 ...

  8. 【NFS项目实战二】NFS共享数据的时时同步推送备份

    [NFS项目实战二]NFS共享数据的时时同步推送备份 标签(空格分隔): Linux服务搭建-陈思齐 ---本教学笔记是本人学习和工作生涯中的摘记整理而成,此为初稿(尚有诸多不完善之处),为原创作品, ...

  9. python 自动化之路 day 20 Django进阶/BBS项目【一】

    一.django进阶 1.django orm 增删改查 1.1.创建表: 1 2 3 >>> from blog.models import Blog >>> b ...

随机推荐

  1. Microsoft Hyperlapse——让第一人称视频更快更流畅

    Hyperlapse--让第一人称视频更快更流畅" title="Microsoft Hyperlapse--让第一人称视频更快更流畅"> 职业摄影师Nick Di ...

  2. Myeclipse 错误An internal error has occurred 解决办法

    1. 给MyEclipse的快捷方式加个参数再重新启动一次.      步骤如下:右键选中快捷方式属性选项,在快捷方式页,目标一项最后加上-clean选项,如"C:\MyEclipse6\e ...

  3. 携程酒店DevOps测试实践

    作者简介 王幸福,携程酒店研发部高级测试经理,负责无线自动化测试相关工作.在测试框架和平台研发.移动测试.DevOps等领域有着丰富的经验. 如今很多大型互联网公司.创新型企业都在积极地进行DevOp ...

  4. OAuth 2.0学习笔记

    文章目录 OAuth的作用就是让"客户端"安全可控地获取"用户"的授权,与"服务商提供商"进行互动. OAuth在"客户端&quo ...

  5. 海洋深处的数据中心——微软Natick项目

    数据中心(data center)是云计算的支柱,云计算的蓬勃发展离不开数据中心在建造运营方面的不断创新.但云端数据中心的运行过程中会产生大量热量,冷却降温过程则意味着巨大的能源消耗,这意味着需要庞大 ...

  6. Vue的fetch的概述和使用

    Fetch基本概念 (前端小白,刚学习vue,写的不好或是不对,请各位大佬多多指正!感激不尽!) Fetch 是一个现代的概念, 等同于 XMLHttpRequest.它提供了许多与XMLHttpRe ...

  7. sql -- 获取商品分类的最新销售情况

    表设计: 需求: 1.先找出各个分类中销售的最新日期 select prod_class,max(sales_date) as sn from prod_sales group by prod_cla ...

  8. Python神经网络编程笔记

    神经元 想一想便知道,当一个人捏你一下以至于你会痛得叫起来的力度便是神经元的阈值,而我们构建的时候也是把这种现象抽象成一个函数,叫作激活函数. 而这里便是我们使用sigmoid函数的原因,它是一个很简 ...

  9. Docker Compose 项目打包部署

    Docker Compose 前面我们使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker build.docker run 等命令操作容器.然而微服务架构的应用系统一 ...

  10. 菜鸟系列 Golang 实战 Leetcode —— 面试题24. 反转链表

    定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点.   示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3- ...