登陆和生成图片验证码

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. 吴裕雄--天生自然 python数据分析:健康指标聚集分析(健康分析)

    # This Python 3 environment comes with many helpful analytics libraries installed # It is defined by ...

  2. HEXO+Git+Github+域名搭建个人博客

    搭建个人博客可以分为以下五个部分 一.搭建本地环境(个人为Win10) 1.安装Git,下载地址:点击 下载后,按提示进行安装即可,作用是:把本地的内容提交到github上去 注意:官网下载速度不是很 ...

  3. 一个异步访问redis的内存问题

    | 分类 redis  | 遇到一个redis实例突然内存飙高的案例, 具体症状如下: 客户端使用异步访问模式 单个请求的回包很大,hgetall一个8M的key 由于访问量比较大,已经登录不上red ...

  4. iPhone5se难逃“酱油”命运?

    苹果春季新品发布会即将举行,按照惯例,只会有一些不痛不痒的产品出现,最起码,不会有革命性的爆点,今年大抵相似,最大的亮点莫过于,苹果有可能会推出一款名叫"iPhone5se"的手机 ...

  5. Redis list实现原理 - 双向循环链表

    双向链表 双向表示每个节点知道自己的直接前驱和直接后继,每个节点需要三个域 查找方向可以是从左往右也可以是从右往左,但是要实现从右往左还需要终端节点的地址,所以通常会设计成双向的循环链表; 双向的循环 ...

  6. 学习经典算法—JavaScript篇(一)排序算法

    前端攻城狮--学习常用的排序算法 一.冒泡排序 优点: 所有排序中最简单的,易于理解: 缺点: 时间复杂度O(n^2),平均来说是最差的一种排序方式: 因为在默认情况下,对于已经排好序的部分,此排序任 ...

  7. Python学习之布尔和数字

    布尔有True和Flase两种值 数字0.None,以及元素为空的容器类对象都可视为False,反之为Ture.

  8. 简单配置Vue路由

    简单配置Vue路由 1.  创建一个单文件组件Test.vue <template> <div>Test</div> </template> <s ...

  9. zabbix图表出现中文乱码

    搭建完成Zabbix监控服务器之后,切换到中文语言,图表展示出现乱码,如图所示 按照网上流传的上传windows下的字体的方法,还是不行,最后发现是PHP编译时的问题: php在编译时开启了-enab ...

  10. selenium中js定位

    学习selenium的时候经常用扫的定位方式WebDriver定位方式,但是一些Windows的窗口就无力了,这时候可以用js定位 使用js定位的时候是用DOM树定位方式 eg: document.g ...