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的Tornado框架配置使用Jinja2模板引擎的方法
Jun 30 Python
Python基础之getpass模块详细介绍
Aug 10 Python
详解Python核心编程中的浅拷贝与深拷贝
Jan 07 Python
python中计算一个列表中连续相同的元素个数方法
Jun 29 Python
Flask框架Jinjia模板常用语法总结
Jul 19 Python
django3.02模板中的超链接配置实例代码
Feb 04 Python
python实现逆滤波与维纳滤波示例
Feb 26 Python
python GUI库图形界面开发之PyQt5中QWebEngineView内嵌网页与Python的数据交互传参详细方法实例
Feb 26 Python
Python文件夹批处理操作代码实例
Jul 21 Python
python 装饰器重要在哪
Feb 14 Python
教你怎么用PyCharm为同一服务器配置多个python解释器
May 31 Python
Python面向对象编程之类的概念
Nov 01 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
火影忍者:这才是千手柱间和扉间的真正死因,角都就比较搞笑了!
2020/03/10 日漫
让Nginx支持ThinkPHP的URL重写和PATHINFO的方法分享
2011/08/08 PHP
thinkphp3查询mssql数据库乱码解决方法分享
2014/02/11 PHP
php+ajax实现无刷新分页的方法
2014/11/04 PHP
Laravel 队列使用的实现
2019/01/08 PHP
Laravel服务容器绑定的几种方法总结
2020/06/14 PHP
PHP mkdir创建文件夹实现方法解析
2020/11/13 PHP
学习ExtJS 访问容器对象
2009/10/07 Javascript
JavaScript 动态添加表格行 使用模板、标记
2009/10/24 Javascript
禁止页面刷新让F5快捷键及右键都无效
2014/01/22 Javascript
javascript页面加载完执行事件代码
2014/02/11 Javascript
javascript 正则表达式去空行方法
2017/01/24 Javascript
canvas红包照片实例分享
2017/02/28 Javascript
JS请求servlet功能示例
2017/06/01 Javascript
Angular4学习笔记之准备和环境搭建项目
2017/08/01 Javascript
bootstrap模态框嵌套、tabindex属性、去除阴影的示例代码
2017/10/17 Javascript
js数组去重的N种方法(小结)
2018/06/07 Javascript
layui use 定义js外部引用函数的方法
2019/09/26 Javascript
[02:38]DOTA2超级联赛专访Loda 认为IG世界最强
2013/05/27 DOTA
Django自定义分页效果
2017/06/27 Python
深入理解Django的自定义过滤器
2017/10/17 Python
使用python存储网页上的图片实例
2018/05/22 Python
Django 视图层(view)的使用
2018/11/09 Python
torchxrayvision包安装过程(附pytorch1.6cpu版安装)
2020/08/26 Python
Jupyter notebook命令和编辑模式常用快捷键汇总
2020/11/17 Python
使用CSS3设计地图上的雷达定位提示效果
2016/04/05 HTML / CSS
意大利综合购物网站:Giordano Shop
2016/10/21 全球购物
美味咖啡的顶级烘焙师:Cafe Britt
2018/03/15 全球购物
孤独星球出版物:Lonely Planet Publications
2018/03/17 全球购物
英国水族馆和池塘用品购物网站:Warehouse Aquatics
2019/08/29 全球购物
管理站站长岗位职责
2013/11/27 职场文书
前厅收银主管岗位职责
2014/02/04 职场文书
高中军训感言500字
2014/02/24 职场文书
暑期培训随笔感言
2014/03/10 职场文书
《我爱祖国》演讲稿1000字
2014/09/26 职场文书
2016应届毕业生实习评语
2015/12/01 职场文书