python-flask搭建平台,HTML+CSS+JS写前端的web全栈-uploadfiles
off999 2024-09-27 13:57 21 浏览 0 评论
前面小编说这个项目有两个页面,一个是sketch.html定义的介绍实验室项目(包括abstract,paper,framework,code,results等)的纯前端页面;另一个则是demo.html定义的用户成果体验页面。
通过点击在sketch.html里的按钮进入另一个页面,要怎么实现呢?
上图是sketch.html里的页面跳转按钮!
其定义代码在sketch.html如下:
<head>
……
<h2>Demo</h2>
<dd></dd>
<dd>
Click <a href="{{ url_for('gotoDemo') }}" style="border: #FF8104 solid 1px; border-radius: 15px; color: #FF8014; text-decoration: none; padding-left: 15px; padding-right: 15px;">here</a> to have a join!
</dd>
……
</head>
注意,这里我们并不是一个真正的<input type="button"/>按钮,而是一个<a/>链接。通过对 href 的定义,在“{{ url_for('函数名称') }}”来将其绑定到后台sketch.py的一个有着相同函数名的函数上!
后台的代码如下:
@app.route('/sketch/demo')
def gotoDemo():
return render_template('demo.html')
这里要注意的有两点:
1)路由的设置,是区别于其他已定义路由的,因为一个页面对应惟一一个路由(注、;路由的设置必须以‘/’开头);
2)后台函数返回我们希望看到的新的html页面。
步入正题:
首先为大家展示一下我们的demo页面组成,其中主要的是
1)“left”:用来展示选中的处理前的图片;
2)“right”:用来展示对应的处理后的图片;
3)“select image”:点击它就会调出windows的文件选择窗口;当我们选中图片后,选中的文件就会自动上传了!这一点很重要,换句话说,submit按钮是没有用途的,但实际应用中我们需要这么一个按钮来帮助我们完善一个完整的用户体验;
4)介于image串口和select按钮之间的灰色长条,就是我们的进度条了!
1. 使用大神的插件
网址是:https://github.com/blueimp/jQuery-File-Upload
这是一个灰常灰常经典而实用的插件了,我们需要下载整个工程,但这里小编仅是使用最简单的版本
其中我们需要的只是以下几个文件:
① jQuery-File-Upload-master\css\jquery.fileupload.css
② jQuery-File-Upload-master\css\style.css
③ jQuery-File-Upload-master\js\jquery.iframe-transport.js
④ jQuery-File-Upload-master\js\jquery.fileupload.js
⑤ jQuery-File-Upload-master\js\vendor\jquery.ui.widget.js
⑥ 额外下载jquery-min.js文件
将其复制到对应的“static/css”或者“static/js”目录下。
在实际应用中,我们还需要引入下面两个关于Bootstrap的链接。
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
2. 小白的实现
完整的demo.html代码如下
<!-- demo.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
<link rel="stylesheet" href="{{ url_for('static', filename='css/jquery.fileupload.css') }}">
<link rel="stylesheet" href="{{ url_for('static', filename='css/demo.css') }}">
<!-- 这个是我额外自己添加的.css文件 -->
</head>
<body>
<script src="{{ url_for('static', filename='js/jquery-3.2.1.min.js') }}"></script>
<!-- 这里我下载的是jquery-3.2.1.min.js -->
<script src="{{ url_for('static', filename='js/vendor/jquery.ui.widget.js') }}"></script>
<script src="{{ url_for('static', filename='js/jquery.iframe-transport.js') }}"></script>
<script src="{{ url_for('static', filename='js/jquery.fileupload.js') }}"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<!-- the title bar 标题 -->
<h1 style="padding-left: 30px; padding-right: 30px; padding-top: 15px; padding-bottom: 15px;">
<b>Sketch Simplification</b>
</h1>
<dd></dd>
<br/><br/>
<!-- the image windows 图片窗口 -->
<div>
<img src="" id="left" name="left" style="padding: 10px; width: 50%; float: left; border: #f48401 solid 1px;"/>
<img src="" id="right" name="right" style="padding: 10px; width: 50%; border: #f48401 solid 1px;"/>
</div>
<br/>
<!-- the process bar 进度条 -->
<div id="progress" class="progress">
<div class="progress-bar progress-bar-success" style="background-color: #f48401;"></div>
</div>
<!-- the two buttons 两个按钮-->
<div>
<span class="btn btn-success fileinput-button" style="background-color: #f48401; border: none">
<i class="glyphicon glyphicon-plus"></i>
<span>Select images...</span>
<input id="fileupload" type="file" name="files[]" multiple accept="image/png, image/jpg, image/jpeg">
</span><!-- 选择(并上传)按钮 -->
<input type="button"
style="color: white;
font-size: 15px;
background-color: #ffaf53;
border-radius: 8px;
padding-top: 10px; padding-bottom: 10px; padding-left: 20px; padding-right: 20px;
border: none;"
id="submit";
value="Submit"><!-- 提交按钮 -->
</div>
<script type="text/javascript">
$(function () {// 标准写法,表示包含在function(){}之内的函数和变量都必须是在页面完全加载完毕后才发挥作用
'use strict';// 标准写法,JS的格式要求
var url = 'http://127.0.0.1:5000/sketch/upload';
// ** 自定义一个新的url,我们假设有一个潜藏的页面叫作‘http://127.0.0.1:5000/sketch/upload’
// ** 我们希望在那个虚拟的地方进行与后台的数据交换,
// ** 因此,我们后台的对应函数的路由应该设置为“ @app.route('/sketch/upload') ”
// ** 下面我们打算构建一组东西,是给file按钮准备的,
// * 包括了:fileupload,prop,
// * 第一部分的fileupload包括了:url, 信息交互的数据类型,done,progressall
$('#fileupload').fileupload({
url: url,
dataType: 'json',// 数据交互的类型
// done表示当接收到后端反馈的信息是要做的动作
done: function (e, data) {
var filepath = "", filepath_ = "";
$.each(data.result.files, function (index, file) {
$('<p style="display: none"/>').text(file.name).appendTo(document.body);
filepath = file.filepath;
filepath_ = file.filepath_;
});
$('#left').attr('src', '../' + filepath);
$('#right').attr('src', '../' + filepath_);
},// 这一部分小编会结合后端的函数一起讲解
// progressall表示在选择好文件后上传文件过程中要做的动作
progressall: function (e, data) {
// 显然这是对进度条做宽度变化
var progress = parseInt(data.loaded / data.total * 100, 10);
$('#progress .progress-bar').css(
'width',
progress + '%'
);
}
}).prop('disabled', !$.support.fileInput)
.parent().addClass($.support.fileInput ? undefined : 'disabled');
});
</script>
</body>
</html>
正如小编前面提到的,当我们确定选择的图片后,文件就已经上传了,所以在提交按钮的js函数里才会有一个done的函数来解决“当传输完成并且顺利获得后台的反馈时采取什么样的动作”。
我们的思路是,先在后台把获得的图片读取并暂时根据本地时间命名、保存下来,完了后我们在重新读取,进行一系列图像处理,而后再把结果暂时存储下来,最后我们只需要返回原图片和结果图片的两条路径既可,再通过JS对<img/>图片标签进行更新。
sketch.py新增的函数
@app.route('/sketch/upload', methods=['POST', 'GET'])
def upload():
if request.method == 'POST':
f = request.files['files[]']
# print(f)
filename = f.filename# 获取接收到的文件名
# print(filename)
minetype = f.content_type# 文件类型
# print(minetype)
now_time = datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S')# 获取本地时间,进行图片重命名
dir = 'static/temp-img/rough/' + now_time
# ‘static/temp-img/rough/’是我们预设置的路径,用来暂时存储原图片,于是我们构造了图片的存储路径和名字
os.makedirs(dir)
filepath = dir +"/" + now_time + "." + filename.split(".")[1]# 但别忘记我们还需要获得图片格式(扩展名,可能是.jpg,.png等)
f.save(filepath)# 将文件存储下来
img = Image.open(filepath).convert('L')# 重新读出图片
img_ = F(img)# 并对齐进行某种处理,返回结果图片
filepath_ = "static/temp-img/simplified/model_iter_39000.npz/" + now_time + "." + filename.split(".")[1]
# ‘static/temp-img/simplified/’也是我们预设置的路径,用来暂时存储结果图片
img_.save(filepath_)
# 最后我们就可以返回对应的路径啦
return simplejson.dumps({
"files":
[{
"name": filename,
"mintype": minetype,
"filepath": filepath,
"filepath_": filepath_
}]
})
else:
return render_template('demo.html')
好了,我们发现,如果成功的话,就会把原图片和结果图片在后台的路径传回前台,那么接下来我们要做的也就是通过说“更新img的src值来迫使前端以获取html所需图片为理由更新并显示图片”!
最后我们再来看前面那一段done的内容,就很好懂了吧!
done: function (e, data) {// 这里的data正是后台传回的数据
var filepath = "", filepath_ = "";
$.each(data.result.files, function (index, file) {
$('<p style="display: none"/>').text(file.name).appendTo(document.body);
filepath = file.filepath;
filepath_ = file.filepath_;
});// 因为可能是多文件相传,但我们只选择最后一个文件的名字
$('#left').attr('src', '../' + filepath);
$('#right').attr('src', '../' + filepath_);
// jQuery风格的 html 标签属性更新
document.getElementById('right').style.visibility = 'hidden';
},
最后是效果图啦。
以及后期经过完善后,实现的效果。
总结
至此,我们了解了基于bootstrap的文件上传,和前端与flask后端做数据交互的一种方式。
下一篇,我们将再了解另外一中前后台交互方式!
相关推荐
- Python 数据分析——利用Pandas进行分组统计
-
话说天下大势,分久必合,合久必分。数据分析也是如此,我们经常要对数据进行分组与聚合,以对不同组的数据进行深入解读。本章将介绍如何利用Pandas中的GroupBy操作函数来完成数据的分组、聚合以及统计...
- python数据分析:介绍pandas库的数据类型Series和DataFrame
-
安装pandaspipinstallpandas-ihttps://mirrors.aliyun.com/pypi/simple/使用pandas直接导入即可importpandasas...
- 使用DataFrame计算两列的总和和最大值_[python]
-
【如果对您有用,请关注并转发,谢谢~~】最近在处理气象类相关数据的空间计算,在做综合性计算的时候,DataFrame针对每列的统计求和、最大值等较为方便,对某行的两列或多列数据进行求和与最大值等的简便...
- 8-Python内置函数
-
Python提供了丰富的内置函数,这些函数可以直接使用而无需导入任何模块。以下是一些常用的内置函数及其示例:1-print()1-1-说明输出指定的信息到控制台。1-2-例子2-len()2-1-说...
- Python中函数式编程函数: reduce()函数
-
Python中的reduce()函数是一个强大的工具,它通过连续地将指定的函数应用于序列(如列表)来对序列(如列表)执行累积操作。它是functools模块的一部分,这意味着您需要在使用它之...
- 万万没想到,除了香农计划,Python3.11竟还有这么多性能提升
-
众所周知,Python3.11版本带来了较大的性能提升,但是,它具体在哪些方面上得到了优化呢?除了著名的“香农计划”外,它还包含哪些与性能相关的优化呢?本文将带你一探究竟!作者:BeshrKay...
- 最全python3.11版12类75个内置函数大全
-
获取全部内置函数:importbuiltins#导入模块yc=[]#异常属性nc=[]#不可调用fn=[]#内置函数defll(ty=builtins):...
- 软件测试笔试题
-
测试工程师岗位,3-5年,10-14k1.我司有一款产品,类似TeamViewer,向日葵,mstsc,QQ远程控制产品,一个PC客户端产品,请设想一下测试要点。并写出2.写出常用的SQL语句8条,l...
- 备战各大互联网巨头公司招聘会,最全Python面试大全,共300题
-
前言众所周知,越是顶尖的互联网公司在面试这一part的要求就越高,需要你有很好的技术功底、项目经验、一份漂亮的简历,当然还有避免不了的笔试过关。对于Python的工程师来说,全面掌握好有关Python...
- 经典 SQL 数据库笔试题及答案整理
-
马上又是金三银四啦,有蛮多小伙伴在跳槽找工作,但对于年限稍短的软件测试工程师,难免会需要进行笔试,而在笔试中,基本都会碰到一道关于数据库的大题,今天这篇文章呢,就收录了下最近学员反馈上来的一些数据库笔...
- 用Python开发日常小软件,让生活与工作更高效!附实例代码
-
引言:Python如何让生活更轻松?在数字化时代,编程早已不是程序员的专属技能。Python凭借其简洁易学的特点,成为普通人提升效率、解决日常问题的得力工具。无论是自动化重复任务、处理数据,还是开发个...
- 太牛了!102个Python实战项目被我扒到了!建议收藏!
-
挖到宝了!整整102个Python实战项目合集,从基础语法到高阶应用全覆盖,附完整源码+数据集,手把手带你从代码小白变身实战大神!这波羊毛不薅真的亏到哭!超全项目库,学练一站式搞定这份资...
- Python中的并发编程
-
1.Python对并发编程的支持多线程:threading,利用CPU和IO可以同时执行的原理,让CPU不会干巴巴等待IO完成。多进程:multiprocessing,利用多核CPU...
- Python 也有内存泄漏?
-
1.背景前段时间接手了一个边缘视觉识别的项目,大功能已经开发的差不多了,主要是需要是优化一些性能问题。其中比较突出的内存泄漏的问题,而且不止一处,有些比较有代表性,可以总结一下。为了更好地可视化内存...
- python爬虫之多线程threading、多进程、协程aiohttp批量下载图片
-
一、单线程常规下载常规单线程执行脚本爬取壁纸图片,只爬取一页的图片。importdatetimeimportreimportrequestsfrombs4importBeautifu...
你 发表评论:
欢迎- 一周热门
-
-
python 3.8调用dll - Could not find module 错误的解决方法
-
加密Python源码方案 PyArmor(python项目源码加密)
-
Python3.8如何安装Numpy(python3.6安装numpy)
-
大学生机械制图搜题软件?7个受欢迎的搜题分享了
-
编写一个自动生成双色球号码的 Python 小脚本
-
免费男女身高在线计算器,身高计算公式
-
将python文件打包成exe程序,复制到每台电脑都可以运行
-
Python学习入门教程,字符串函数扩充详解
-
Python数据分析实战-使用replace方法模糊匹配替换某列的值
-
Python进度条显示方案(python2 进度条)
-
- 最近发表
- 标签列表
-
- python计时 (54)
- python安装路径 (54)
- python类型转换 (75)
- python进度条 (54)
- python的for循环 (56)
- python串口编程 (60)
- python写入txt (51)
- python读取文件夹下所有文件 (59)
- java调用python脚本 (56)
- python操作mysql数据库 (66)
- python字典增加键值对 (53)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python qt (52)
- python人脸识别 (54)
- python斐波那契数列 (51)
- python多态 (60)
- python命令行参数 (53)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- centos7安装python (53)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)