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 25 Python
Python爬虫设置代理IP的方法(爬虫技巧)
Mar 04 Python
python实现requests发送/上传多个文件的示例
Jun 04 Python
Python 十六进制整数与ASCii编码字符串相互转换方法
Jul 09 Python
Python实现识别图片内容的方法分析
Jul 11 Python
浅析python内置模块collections
Nov 15 Python
通过实例解析Python return运行原理
Mar 04 Python
python安装和pycharm环境搭建设置方法
May 27 Python
python mock测试的示例
Oct 19 Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
Nov 20 Python
Matlab使用Plot函数实现数据动态显示方法总结
Feb 25 Python
Opencv 图片的OCR识别的实战示例
Mar 02 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 抽象类的简单应用
2011/09/06 PHP
php分页代码学习示例分享
2014/02/20 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
javascript 学习笔记(八)javascript对象
2011/04/12 Javascript
setTimeout函数兼容各主流浏览器运行执行效果实例
2013/06/13 Javascript
转义字符(\)对JavaScript中JSON.parse的影响概述
2013/07/17 Javascript
jquery $.each()使用探讨
2013/09/23 Javascript
常用原生JS兼容性写法汇总
2016/04/27 Javascript
Angular.JS学习之依赖注入$injector详析
2016/10/20 Javascript
JavaScript轻松创建级联函数的方法示例
2017/02/10 Javascript
Angular实现跨域(搜索框的下拉列表)
2017/02/16 Javascript
微信小程序本作用域下调用全局JS详解及实例
2017/02/22 Javascript
浅谈JS对html标签的属性的干预以及对CSS样式表属性的干预
2017/06/25 Javascript
layui radio性别单选框赋值方法
2018/08/15 Javascript
基于vue-cli 路由 实现类似tab切换效果(vue 2.0)
2019/05/08 Javascript
jquery 插件重新绑定的处理方法分析
2019/11/23 jQuery
关于vue3默认把所有onSomething当作v-on事件绑定的思考
2020/05/15 Javascript
vue-cli3配置favicon.ico和title的流程
2020/10/27 Javascript
nuxt.js写项目时增加错误提示页面操作
2020/11/05 Javascript
[04:49]2014DOTA2国际邀请赛 Newbee顺利挺进总决赛 ImbaTV独家专访
2014/07/19 DOTA
[01:03]DOTA2新的征程 你的脚印值得踏上
2014/08/13 DOTA
[45:25]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.22
2019/09/05 DOTA
Python中实现对list做减法操作介绍
2015/01/09 Python
python通过pil将图片转换成黑白效果的方法
2015/03/16 Python
Python中的左斜杠、右斜杠(正斜杠和反斜杠)
2016/08/30 Python
Python按行读取文件的实现方法【小文件和大文件读取】
2016/09/19 Python
Python实现的排列组合计算操作示例
2017/10/13 Python
Python 矩阵转置的几种方法小结
2019/12/02 Python
python数字类型math库原理解析
2020/03/02 Python
HTML5的文档结构和新增标签完全解析
2017/04/21 HTML / CSS
汽车专业毕业生自荐信
2013/11/03 职场文书
大学生的网上创业计划书
2013/12/31 职场文书
客户服务经理岗位职责
2014/01/29 职场文书
妈妈的账单教学反思
2014/02/06 职场文书
优秀驾驶员先进事迹材料
2014/05/04 职场文书
2015年司机工作总结
2015/04/23 职场文书