直接上代码:
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 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,因此 ...
vxworks开发环境Tornado中文培训教程
tornado 官方文档中文翻译版本,epub格式,可在kindle,掌阅等平台观看。
Tornado 2.2 入门介绍Tornado 2.2 入门介绍Tornado 2.2 入门介绍Tornado 2.2 入门介绍
Introduction to tornado中文教程,介绍tornado的中文资料,难得的好书,简单通俗,实用的手册
真正的Tornado教程,建立工程,图示教程
介绍tornado的中文资料,难得的好书,简单通俗,实用的手册
我们三个都因为Tornado的速度、简单和可扩展性而深深地爱上了它,在一些个人项目中尝试之后,我们将其运用到日常工作中。我们已经看到,Tornado在很多大型或小型的项目中提升了开发者的速度(和乐趣!),同时,其...
认识Tornado II和Vxworks
VxWorks和Tornado简介 任务和任务间通信 信号、中断处理与定时机制 调试环境与实例分析 网络编程 VxWorks操作系统配置
本文介绍了tornado的安装和使用特点,适合初级入门者使用擦靠
tornado教程,纯正的中文版教程,适合初学者入门使用
Tornado使用指南(中文版)
认识Tornado+II和Vxworks
作为Web服务器,Tornado 有较为出色的抗负载能力,官方用nginx反向代理的方式部署Tornado和其它 Python web应用框架进行对比,结果最大浏览量超过第二名近40%。 性能: Tornado有 着优异的性能。它试图解决C10k问题,...
Tornado实战Demo全集,适合新手对Tornado项目的研究,包括认证、mysql数据库操作等
是一个很好的课件,课件首先介绍了VxWorks和tornado开发环境的相关知识,然后用一个实例详细介绍了使用tornado建立工程、build、编译和调制的整个过程,每一步都有详细的说明。很适合初学者
Tornado上传和下载文件(以CSV文件为例) https://xercis.blog.csdn.net/article/details/108361817
中文版的tornado介绍,转好的pdf中文格式.