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通过装饰器检查函数参数数据类型的方法
Mar 13 Python
Python实现批量将word转html并将html内容发布至网站的方法
Jul 14 Python
Python解析命令行读取参数--argparse模块使用方法
Jan 23 Python
Python定义二叉树及4种遍历方法实例详解
Jul 05 Python
python-itchat 统计微信群、好友数量,及原始消息数据的实例
Feb 21 Python
Python爬虫之UserAgent的使用实例
Feb 21 Python
基于python3监控服务器状态进行邮件报警
Oct 19 Python
Python numpy.zero() 初始化矩阵实例
Nov 27 Python
Pytorch 多块GPU的使用详解
Dec 31 Python
Django用户身份验证完成示例代码
Apr 03 Python
基于matplotlib xticks用法详解
Apr 16 Python
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
Oct 15 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
基于mysql的论坛(1)
2006/10/09 PHP
PHP的博客ping服务代码
2012/02/04 PHP
使用PHP实现生成HTML静态页面
2015/11/18 PHP
toggle一个div显示或隐藏且可扩展成自定义下拉框
2013/09/12 Javascript
javascript移出节点removeChild()使用介绍
2014/04/03 Javascript
Node.js中使用计时器定时执行函数详解
2014/08/15 Javascript
JavaScript中number转换成string介绍
2014/12/31 Javascript
javascript中JSON对象与JSON字符串相互转换实例
2015/07/11 Javascript
JavaScript实现可拖拽的拖动层Div实例
2015/08/05 Javascript
强大Vue.js组件浅析
2016/09/12 Javascript
D3.js实现文本的换行详解
2016/10/14 Javascript
jQuery Masonry瀑布流布局神器使用详解
2017/05/25 jQuery
node.js 核心http模块,起一个服务器,返回一个页面的实例
2017/09/11 Javascript
无限循环轮播图之运动框架(原生JS实现)
2017/10/01 Javascript
微信小程序出现wx.navigateTo页面不跳转问题的解决方法
2017/12/26 Javascript
微信小程序实现YDUI的ScrollTab组件
2018/02/02 Javascript
Vue-router 中hash模式和history模式的区别
2018/07/24 Javascript
详解Vue 动态组件与全局事件绑定总结
2018/11/11 Javascript
详解Vue调用手机相机和相册以及上传
2019/05/05 Javascript
使用VScode 插件debugger for chrome 调试react源码的方法
2019/09/13 Javascript
[45:52]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第二场 12.09
2020/12/12 DOTA
Python牛刀小试密码爆破
2011/02/03 Python
Java中重定向输出流实现用文件记录程序日志
2015/06/12 Python
Pycharm学习教程(5) Python快捷键相关设置
2017/05/03 Python
transform python环境快速配置方法
2018/09/27 Python
Python Unittest根据不同测试环境跳过用例的方法
2018/12/16 Python
keras 两种训练模型方式详解fit和fit_generator(节省内存)
2020/07/03 Python
浅谈Python爬虫原理与数据抓取
2020/07/21 Python
德国箱包网上商店:koffer24.de
2016/07/27 全球购物
Vision Directa智利眼镜网:框架眼镜、隐形眼镜和名牌太阳眼镜
2016/11/23 全球购物
保密工作责任书
2014/04/16 职场文书
承诺书格式
2014/06/03 职场文书
初中生毕业评语
2014/12/29 职场文书
Golang 使用Map实现去重与set的功能操作
2021/04/29 Golang
详解PHP服务器如何在有限的资源里最大提升并发能力
2021/05/25 PHP
浅谈resultMap的用法及关联结果集映射
2021/06/30 Java/Android