简单BBS项目开始(二)
登陆和生成图片验证码
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项目开始(二)的更多相关文章
- BBS项目(二)
目录 BBS项目(二) ORM 创建相关表 表模型 修改admin样式 Simple-UI 注册表添加数据 注册forms类编写 注册功能前端搭建 头像实时显示功能实现 BBS项目(二) 可以在本地写 ...
- 简单BBS项目开始(一)
1.BBS需求分析和创建ORM 1. 需要哪些表 1. UserInfo 1. username 2. password 3. avatar #头像图片 2. 文章表: title publish_d ...
- Ant—使用Ant构建简单Java项目(三)
博客<Ant-使用Ant构建简单Java项目(二)>我们简化了运行Test类中main方法须要运行的命令,本博客来介绍一下如何使build.xml文件和当中使用property标签定义的属 ...
- BBS项目分布搭建二(个人站点相关)
BBS项目分布搭建二 1. 首页详情补充 # 在home.html文件中 body标签内补充: <div class="container-fluid"> <di ...
- 简单创建一个SpringCloud2021.0.3项目(二)
目录 1. 项目说明 1. 版本 2. 用到组件 3. 功能 2. 上一篇教程 3. 创建公共模块Common 4. 网关Gateway 1. 创建Security 2. Security登陆配置 3 ...
- BBS项目知识点汇总
目录 bbs项目知识点汇总 一. JavaScript 1 替换头像 2 form表单拿数据 3 form组件error信息渲染 4 添加html代码 5 聚焦操作 二 . html在线编辑器 三 . ...
- 小福bbs——项目需求分析
# 一.简单了解 这个作业属于哪个课程 班级链接 这个作业要求在哪里 作业要求的链接 团队名称 小福bbs 这个作业的目标 第一个版本,根据项目预期情况形成 作业的正文 小福bbs--项目需求分析 其 ...
- 【NFS项目实战二】NFS共享数据的时时同步推送备份
[NFS项目实战二]NFS共享数据的时时同步推送备份 标签(空格分隔): Linux服务搭建-陈思齐 ---本教学笔记是本人学习和工作生涯中的摘记整理而成,此为初稿(尚有诸多不完善之处),为原创作品, ...
- python 自动化之路 day 20 Django进阶/BBS项目【一】
一.django进阶 1.django orm 增删改查 1.1.创建表: 1 2 3 >>> from blog.models import Blog >>> b ...
随机推荐
- 4-CSS规范
4.1 命名规范:4.1.1 css文件命名 reset.css 重置样式,重置元素默认样式,使得页面在所有浏览器中有统一的外观 global.css 全局样式,全站公用,定义页面基础样式(常见的公共 ...
- Docker容器时间同步问题
具体操作: 为了保证容器和宿主机之间的时间同步,采用如下参数:-v /etc/localtime:/etc/localtime:ro但是在页面访问的时候时间依然相差8个小时: 该怎么破解! 回复: 1 ...
- linux下时区的一些认识
最近搞ONVIF,在时间接口中有一个时区的字段,需要使用POSIX格式的时区,ONVIF手册要求符合IEEE100.3.1的第8章节,但要注册才能看IEEE标准,我印象中以前下载过,但找不到了.幸好, ...
- Mongo Delete-19
数据初始化 db.inventory.insertMany( [ { item: "journal", qty: 25, size: { h: 14, w: 21, uom: &q ...
- MIZ702N开发环境的准备1
前言 最近由于工作需要开始接手基于MIZ702的硬件平台的Linux的开发,仔细想想,工作这么久,这好像还是我第一次接手嵌入式Liunx相关的工作.这几天拿到开发板,开始了阅读文档.安装Ubuntu虚 ...
- Flask设置Access-Control_Allow_Origin实现跨域访问
前端访问Flask的接口,浏览器报错:has been blocked by CORS policy: No 'Access-Control-Allow-Origin' heade 需要将Flask的 ...
- vmware workstaion之不能连接外网
Vmwareworkstation15系列桥接模式不能上网解决办法 最近在vmwareworkstation15中创建一个双网卡虚拟机,由于一直连不了外网,一直困扰着我.各种姿势在百度谷歌查找,最终还 ...
- BLAKE及BLAKE2算法详解
1 简介 哈希算法 (Hash Algorithm) 是将任意长度的数据映射为固定长度数据的算法,也称为消息摘要.一般情况下,哈希算法有两个特点: 原始数据的细微变化(比如一个位翻转)会导致结果产生巨 ...
- 【CSS3】自定义设置可编辑元素闪烁光标的颜色
前言 因为业务需求, 要求我们的input框内的文本与悬浮的光标颜色不同, 这样的问题肯定在书本上很难找到解决办法, 需要通过平时的基础积累和经验. 解决方案 使用 ::first-line 伪元素 ...
- 处理公共CDN突然失效的情况
公共CDN的使用 刚开始开发我的博客时,使用的bootcdn,发现他们被黑过,虽然想骂那些“黑客”,但是我们也没办法去防范,只能从自己的网站上入手解决. 那时我还没技术解决这个问题,网上搜过,大都只提 ...