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 06 Python
Python遍历目录的4种方法实例介绍
Apr 13 Python
python xml.etree.ElementTree遍历xml所有节点实例详解
Dec 04 Python
PyCharm 常用快捷键和设置方法
Dec 20 Python
Python matplotlib通过plt.scatter画空心圆标记出特定的点方法
Dec 13 Python
Python MongoDB 插入数据时已存在则不执行,不存在则插入的解决方法
Sep 24 Python
Python类和实例的属性机制原理详解
Mar 21 Python
django form和field具体方法和属性说明
Jul 09 Python
树莓派4B安装Tensorflow的方法步骤
Jul 16 Python
python实现批处理文件
Jul 28 Python
使用python爬取抖音app视频的实例代码
Dec 01 Python
python - timeit 时间模块
Apr 06 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/02 国漫
2019十大人气国漫
2020/03/13 国漫
php+mysql不用递归实现的无限级分类实例(非递归)
2014/07/08 PHP
php curl 获取https请求的2种方法
2015/04/27 PHP
ThinkPHP框架表单验证操作方法
2017/07/19 PHP
PHP+MySql实现一个简单的留言板
2020/07/19 PHP
jQuery 对Select的操作备忘记录
2011/07/04 Javascript
给超链接添加特效鼠标移动展示提示信息且随鼠标移动
2013/10/17 Javascript
js判断ie版本号的简单实现代码
2014/03/05 Javascript
jquery根据属性和index来查找属性值并操作
2014/07/25 Javascript
基于jquery实现的可编辑下拉框实现代码
2014/08/02 Javascript
基于Jquery插件实现跨域异步上传文件功能
2016/04/26 Javascript
判断输入的字符串是否是日期格式的简单方法
2016/07/11 Javascript
Javascript中作用域的详细介绍
2016/10/06 Javascript
微信小程序 教程之模块化
2016/10/17 Javascript
JS常见疑难点分析之match,charAt,charCodeAt,map,search用法分析
2016/12/25 Javascript
详解vue2路由vue-router配置(懒加载)
2017/04/08 Javascript
js实现图片轮播效果学习笔记
2017/07/26 Javascript
layer页面跳转,获取html子节点元素的值方法
2019/09/27 Javascript
[02:23]2014DOTA2国际邀请赛中国战队回顾
2014/08/01 DOTA
[47:12]TFT vs Secret Supermajor小组赛C组 BO3 第三场 6.3
2018/06/04 DOTA
Python实现遍历数据库并获取key的值
2015/05/17 Python
分享8个非常流行的 Python 可视化工具包
2019/06/05 Python
浅析PEP572: 海象运算符
2019/10/15 Python
咖啡为什么会有酸味?你喝到的咖啡為什麼是酸的?
2021/03/17 冲泡冲煮
CSS3的颜色渐变效果的示例代码
2017/09/29 HTML / CSS
美国玛丽莎收藏奢华时尚商店:Marissa Collections
2016/11/21 全球购物
Notino罗马尼亚网站:购买香水和化妆品
2019/07/20 全球购物
英国钻石公司:British Diamond Company
2020/02/16 全球购物
什么是静态路由,其特点是什么?什么是动态路由,其特点是什么?
2013/07/26 面试题
机电一体化职业规划书
2014/01/07 职场文书
请假条的格式
2014/04/11 职场文书
入职担保书怎么写
2014/05/12 职场文书
找工作求职信
2014/07/07 职场文书
蜗居观后感
2015/06/11 职场文书
信息技术课教学反思
2016/02/23 职场文书