Python Tornado批量上传图片并显示功能


Posted in Python onMarch 26, 2020

简介

Tornado龙卷风是一个开源的网络服务器框架,它是基于社交聚合网站FriendFeed的实时信息服务开发而来的。2007年由4名Google前软件工程师一起创办了FriendFeed,旨在使用户能够方便地跟踪好友在Facebook和Twitter等多个社交网站上的活动。结果两年后,Facebook宣布收购FriendFeed,交易价格约为5000万美元。而此时FriendFeed只有12名员工。据说这帮人后来又到了Google,搞出了现在的Google App Engine...

我们开发这个Web服务器的主要目的就是为了处理FriendFeed的实时功能 -- 在FriendFeed的应用里每个活动用户都会保持着一个服务器连接。

Tornado使FriendFeed使用的可扩展的非阻塞Web服务器及其相关工具的开源版本,这个Web框架看起来有些像web.py或 Google的webapp,不过为了更加有效地利用非阻塞服务器环境,Tornado这个Web框架还包含了一些相关的有用工具和优化。

区别

Tornado与现代主流的Web服务器框架有着明显的区别:它使非阻塞式的服务器,速度相当快。这得益于其非阻塞的方式和对epoll的运用。Tornado每秒可以处理数以千计的连接,对于实时Web服务来说Tornado确实是一个理想的Web框架。

与Node.js相同的是,Tornado也采用的是单进程单线程异步IO的网络模型,它们都可以编写异步非阻塞的程序。但由于Node.js是Google Chrome V8引擎的JS运行环境或工具包,它属于偏底层的抽象,扩展了JS编写服务器程序的能力,所以基于Node.js会由不同的Web框架。从这个角度来看Node.js和Tornado其实并不在一个层次上。

Tornado是使用Python编写的Web服务器兼Web应用框架,与主流Web服务器框架不同的是,Tornado是异步非阻塞式服务器,得益于非阻塞式和对epoll模型的运用,Tornado是实时Web服务的一个理想框架,它非常适合开发长轮询、WebSocket和需要与每个用户建立持久连接的应用。

特点

  • 轻量级Web框架
  • 异步非阻塞IO处理方式
  • Tornado采用的单进程单线程异步IO的网络模式,其高性能源于Tornado基于Linux的Epoll(UNIX为kqueue)的异步网络IO。
  • 出色的抗负载能力
  • 不依赖多进程或多线程
  • WSGI全栈替代产品
  • WSGI把应用(Application)和服务器(Server)结合起来,Tornado既可以是WSGI应用也可以是WSGI服务。
  • 既是WebServer也是WebFramework

Tornado是基于Bret Taylor和其他人员为FrientFeed所开发的网络服务框架,当FriendFeed被Facebook收购后得以开源。不同于那些最多只能达到1w并发连接的传统网络服务器。Tornado在设计之初就考虑到了性能因素,旨在解决C10K问题,这样的设计使其成为一个拥有高性能的框架。

正文开始

问题描述

Python Tornado批量上传图片并显示,前后端都要显示

思路

1.文件上传

前端FormData上传,后端BytesIO解析

2.显示图片

前端FileReader读取显示,后端matplotlib显示

代码

index.html

<!DOCTYPE html>
<head>
 <title>批量上传图片并显示</title>
 <meta charset='utf-8'>
 <script src='https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js'></script>
</head>

<body>
<input id='send' type='file' accept="image/png, image/jpeg" multiple><br>
</body>
<script>
 $('#send').change(function () {
  var files = $('#send')[0].files;
  var form = new FormData();
  for (var i = 0; i < files.length; i++) {
   //插入form
   var file = files[i];
   console.log(file);
   form.append('files', file);
   //显示图片
   var fileReader = new FileReader();
   fileReader.readAsDataURL(file);
   fileReader.onloadend = function (event) {
    var src = event.target.result;
    $('body').append('<img src=' + src + ' width=200px>');
   }
  }

  //上传
  $.ajax({
   type: 'POST',
   url: '/upload',
   data: form,
   processData: false,
   contentType: false,
   success: function (response) {
    console.log(response)
   }
  });
 })
</script>
</html>

app.py

import tornado.web
import tornado.ioloop
from PIL import Image
from io import BytesIO
import matplotlib.pyplot as plt
from tornado.options import define, options

define("port", default=8888, help="运行端口", type=int)

class MainHandler(tornado.web.RequestHandler):
 def get(self):
  self.render("index.html")
class UploadHandler(tornado.web.RequestHandler):
 def post(self):
  files = self.request.files['files']
  for file in files:
   img = file['body']
   img = Image.open(BytesIO(img)).convert('RGB')
   plt.imshow(img)
   plt.show()

if __name__ == "__main__":
 app = tornado.web.Application(
  [
   (r"/", MainHandler),
   (r"/upload", UploadHandler),
  ],
 )
 app.listen(options.port)
 print("http://localhost:{}/".format(options.port))
 tornado.ioloop.IOLoop.current().start()

效果

前端

Python Tornado批量上传图片并显示功能

后端

Python Tornado批量上传图片并显示功能

总结

到此这篇关于Python Tornado批量上传图片并显示功能的文章就介绍到这了,更多相关python tornado批量上传内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python教程之用py2exe将PY文件转成EXE文件
Jun 12 Python
利用Python脚本生成sitemap.xml的实现方法
Jan 31 Python
Python标准库inspect的具体使用方法
Dec 06 Python
浅析Python 3 字符串中的 STR 和 Bytes 有什么区别
Oct 14 Python
python实现合并两个排序的链表
Mar 03 Python
Python中print和return的作用及区别解析
May 05 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
Dec 04 Python
详解opencv中画圆circle函数和椭圆ellipse函数
Dec 27 Python
Python+unittest+DDT实现数据驱动测试
Nov 30 Python
python 基于opencv实现图像增强
Dec 23 Python
[原创]赚疯了!转手立赚800+?大佬的python「抢茅台脚本」使用教程
Jan 12 Python
深入浅析Django MTV模式
Sep 04 Python
python列表删除和多重循环退出原理详解
Mar 26 #Python
执行Python程序时模块报错问题
Mar 26 #Python
python3 正则表达式基础廖雪峰
Mar 25 #Python
python 6.7 编写printTable()函数表格打印(完整代码)
Mar 25 #Python
python实现人机五子棋
Mar 25 #Python
pyqt5数据库使用详细教程(打包解决方案)
Mar 25 #Python
详解基于Jupyter notebooks采用sklearn库实现多元回归方程编程
Mar 25 #Python
You might like
给php新手谈谈我的学习心得
2007/02/25 PHP
php创建多级目录代码
2008/06/05 PHP
php提示无法加载或mcrypt没有找到 PHP 扩展 mbstring解决办法
2012/03/27 PHP
php 去除html标记--strip_tags与htmlspecialchars的区别详解
2013/06/26 PHP
使用php语句将数据库*.sql文件导入数据库
2014/05/05 PHP
js实现拖拽 闭包函数详细介绍
2012/11/25 Javascript
javascript自动改变文字大小和颜色的效果的小例子
2013/08/02 Javascript
js open() 与showModalDialog()方法使用介绍
2013/09/10 Javascript
Jquery通过Ajax访问XML数据的小例子
2013/11/18 Javascript
javascript 拷贝节点cloneNode()使用介绍
2014/04/03 Javascript
全面解析Javascript无限添加QQ好友原理
2016/06/15 Javascript
Bootstrap前端开发案例一
2016/06/17 Javascript
Bootstrap表单使用方法详解
2017/02/17 Javascript
详解利用 Express 托管静态文件的方法
2017/09/18 Javascript
监听angularJs列表数据是否渲染完毕的方法示例
2018/11/07 Javascript
React 源码中的依赖注入方法
2018/11/07 Javascript
一次让你了解全部JavaScript的作用域
2019/06/24 Javascript
Vue实现滑动拼图验证码功能
2019/09/15 Javascript
微信h5静默和非静默授权获取用户openId的方法和步骤
2020/06/08 Javascript
[01:03:13]VG vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
详解Python中的四种队列
2018/05/21 Python
Python实现微信消息防撤回功能的实例代码
2019/04/29 Python
Python使用scrapy爬取阳光热线问政平台过程解析
2019/08/14 Python
利用python-docx模块写批量生日邀请函
2019/08/26 Python
用Python实现定时备份Mongodb数据并上传到FTP服务器
2021/01/27 Python
世界上最大的巴士旅游观光公司:Big Bus Tours
2016/10/20 全球购物
澳大利亚最受欢迎的女士度假服装:Kabana Shop
2020/10/10 全球购物
个人自我鉴定总结
2014/03/25 职场文书
小学生校园广播稿
2014/09/28 职场文书
主持人开幕词
2015/01/29 职场文书
安装工程师岗位职责
2015/02/13 职场文书
岗位聘任报告
2015/03/02 职场文书
母婴行业实体、电商模式全面解析
2019/08/01 职场文书
浅析InnoDB索引结构
2021/04/05 MySQL
html中显示特殊符号(附带特殊字符对应表)
2021/06/21 HTML / CSS
如何使用 resize 实现图片切换预览功能
2021/08/23 HTML / CSS