直接上代码:
import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.finish("haha") self.write("Hello, world") class TesHandler(tornado.web.RequestHandler): def get(self): self.write('hello, world!') self.finish("hehe") application = tornado.web.Application([ (r"/", MainHandler), (r'/test',TesHandler), ]) if __name__ == "__main__": application.listen(8888) tornado.ioloop.IOLoop.instance().start()
执行结果:
执行第一个请求:haha
执行第二个请求:hello, world!hehe
后台在执行第一个请求时报错,但是不影响程序运行,也不影响前端显示,执行第二个请求影响前段显示。
下面是第一个请求报错信息:
ERROR:root:Uncaught exception GET / (127.0.0.1) HTTPRequest(protocol='http', host='127.0.0.1:8888', method='GET', uri='/', version='HTTP/1.1', remote_ip='127.0.0.1', body='', headers={'Accept-Language': 'zh-CN,zh;q=0.8', 'Accept-Encoding': 'gzip,deflate,sdch', 'Host': '127.0.0.1:8888', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'User-Agent': 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/28.0.1500.52 Chrome/28.0.1500.52 Safari/537.36', 'Connection': 'keep-alive', 'Cookie': '_xsrf=a9c654af7afb46cd87475974ded7fa6b', 'If-None-Match': '"637d1f5c6e6d1be22ed907eb3d223d858ca396d8"'}) Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/tornado/web.py", line 1042, in _execute getattr(self, self.request.method.lower())(*args, **kwargs) File "test_write.py", line 7, in get self.write("Hello, world") File "/usr/local/lib/python2.7/dist-packages/tornado/web.py", line 489, in write raise RuntimeError("Cannot write() after finish(). May be caused " RuntimeError: Cannot write() after finish(). May be caused by using async operations without the @asynchronous decorator.
分析:
当一个处理请求的行为被执行之后,这个请求会自动地结束。因为 Tornado 当中使用了 一种非阻塞式的 I/O 模型,所以你可以改变这种默认的处理行为——让一个请求一直保持 连接状态,而不是马上返回,直到一个主处理行为返回。要实现这种处理方式,只需要 使用 tornado.web.asynchronous
装饰器就可以了。
使用了这个装饰器之后,你必须调用 self.finish()
已完成 HTTTP 请求,否则 用户的浏览器会一直处于等待服务器响应的状态。
下面(参考http://simple-is-better.com/news/627):
@安江泽
self.finish()代表回应生成的终结,并不代表着请求处理逻辑的终结。假设你有一个block的逻辑是和回应无关的,那么放在self.finish()的后面可以显著的缩短响应时间。所以,如果你确定自己的逻辑需要立即返回,可以在self.finish()后立刻return。Tornado在将这个自由留给了你自己。
另外一个理由是,在call stack里让顶端的函数去弹出一个非顶端的函数,这个逻辑有点奇怪。唯一能够提供退出的机制就是异常了。但是在正常逻辑里面使用异常去实现一个功能,也是很怪的逻辑。
@杨昆
没错 同理还有self.render/self.write
我们在所有这种response语句前加return 例如 return self.redirect(‘/’)
至此,这个问题得到了完美的解决和解答,而我想后者才是更重要的。
相关推荐
tornado 官方文档中文翻译版本,epub格式,可在kindle,掌阅等平台观看。
此外,GNU工具链如GCC和C++编译器也自动集成于Tornado目录树中。 综上所述,Tornado中文培训教程详细介绍了Tornado开发环境的各个方面,从其核心组件、开发工具、配置选项到实时系统特性和交叉开发流程,为学习者...
Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,因此 ...
Tornado 在实时 Web 应用中的优势在于对长轮询和 WebSockets 的支持。长轮询是一种模拟实时推送的技术,服务器在客户端请求没有关闭时保持连接,直到有新数据才返回。WebSockets 则提供双向通信通道,一旦建立连接,...
Tornado 的设计初衷是解决 C10K 问题,即在一个单一进程内高效地处理成千上万个并发连接,这在传统的基于线程的 Web 服务器(如 Apache)中是非常困难的。 #### 二、Tornado 的优势与应用场景 ##### 2.1 高性能与...
**Tornado框架详解** Tornado是一款高性能、异步网络库,最初由FriendFeed开发,后被Facebook收购并开源。它以其非阻塞I/O模型和Web服务器...在实际项目中,结合最佳实践和持续学习,Tornado将成为你强大的工具箱。
Tornado 以其非阻塞 I/O 和高并发性能而著称,尤其适合实时Web应用和长连接服务,如聊天、推送通知、实时数据分析等场景。 **1. Tornado 的核心特性** - **非阻塞 I/O**: Tornado 使用了基于事件的异步模型,使得...
这种设计模式允许 Tornado 在单个线程中同时处理成千上万个并发连接,极大地提高了服务器的响应速度和吞吐量。 **1.3 协程(Coroutines)** 协程是 Tornado 中处理异步任务的主要方式之一。通过使用装饰器 `@gen....
在Python的Web开发框架中,Tornado是一个轻量级且高性能的选择,尤其在处理异步I/O和长连接方面表现出色。本主题将探讨如何在Tornado中实现文件的上传和下载功能,以CSV文件为例。我们将从以下几个方面展开讨论: 1...
在IT行业中,Python是一种广泛应用的编程语言,而Tornado是一个基于Python的Web服务器框架和异步网络库。这个“Tornado实战Demo全集”显然是一份面向初学者的资源,旨在帮助他们深入理解和掌握Tornado框架,特别是其...
Tornado官方翻译文档是关于Tornado这个Python Web框架和异步网络库的使用手册。Tornado是为了解决高并发和长连接问题而设计的,它使用非阻塞的网络I/O模型,从而能够承受成千上万的并发连接,特别适合于实现长轮询、...
Tornado是一个开源的Python Web服务器和网络库,它以其非阻塞I/O模型而闻名,特别适合处理大量的并发连接。在本文中,我们将深入探讨如何搭建Tornado环境以及如何开始使用这个强大的框架。 一、Tornado环境搭建 1....
Introduction to tornado中文教程,介绍tornado的中文资料,难得的好书,简单通俗,实用的手册
在Python和Tornado中,可以使用如RabbitMQ、Kafka或Redis等消息队列作为中介,将任务发布到队列中,然后由分布在不同机器上的工作进程消费。这些工作进程可以是运行相同Tornado应用的实例,它们从队列中获取任务,...
5. **轻量级**:Tornado的设计哲学是简单和轻量,这使得它容易理解和调试,同时也方便与其他Python库集成。 ### 二、安装Tornado 在Python环境中,可以通过pip来安装Tornado: ```bash pip install tornado ``` ...
下面的示例展示了如何在Tornado中处理JSON和JSONP: ```python import tornado.escape class APIHandler(BaseHandler): def finish(self, chunk=None, notification=None): if chunk is None: chunk = {} if ...
本项目结构针对的是一个基础的 Tornado 应用,旨在帮助初学者理解如何组织 Tornado 项目的文件和目录。下面将详细介绍这个简单项目结构中的关键组成部分。 1. **主程序文件 (main.py)**:通常在 Tornado 项目中,`...