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

作者:XerCis 时间:2023-08-07 22:33:21 

简介

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批量上传图片并显示功能

来源:https://blog.csdn.net/lly1122334/article/details/105078432

标签:python,tornado,上传
0
投稿

猜你喜欢

  • python常见的占位符总结及用法

    2023-10-11 10:39:58
  • 详解Mysql自动备份与恢复的几种方法(图文教程)

    2024-01-20 20:05:06
  • Python文件名的匹配之clob库

    2022-11-17 06:59:46
  • Go gRPC服务双向流式RPC教程

    2024-02-09 15:25:35
  • python递归函数用法详解

    2023-02-25 00:45:58
  • Node.js的非阻塞I/O、异步与事件驱动介绍

    2024-05-13 09:35:02
  • BootStrap 表单控件之单选按钮水平排列

    2024-05-11 09:43:18
  • python通过apply使用元祖和列表调用函数实例

    2021-02-18 03:18:32
  • TensorFLow 变量命名空间实例

    2021-06-09 04:40:14
  • 深入理解r2dbc在mysql中的使用

    2024-01-26 20:14:10
  • Django 解决开发自定义抛出异常的问题

    2023-03-05 12:43:55
  • python3.6+django2.0开发一套学员管理系统

    2022-11-10 14:15:21
  • php动态生成版权所有信息的方法

    2024-05-02 17:17:30
  • 5个提高你站点可读性的方法

    2011-01-31 17:48:00
  • YOLOv5部署到web端详细过程(flask+js简单易懂)

    2023-03-28 07:00:17
  • Python编写memcached启动脚本代码实例

    2023-02-13 19:59:51
  • 微信小程序之事件交互操作实例分析

    2024-04-19 10:29:54
  • Python设计模式创建型原型模式

    2023-07-21 21:19:25
  • JS继承 笔记

    2024-04-23 09:15:11
  • PYcharm 激活方法(推荐)

    2022-07-27 01:51:21
  • asp之家 网络编程 m.aspxhome.com