`
sls0919
  • 浏览: 125910 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

tornado中finish和write区别

阅读更多

直接上代码:

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(‘/’)

至此,这个问题得到了完美的解决和解答,而我想后者才是更重要的。

 

0
1
分享到:
评论

相关推荐

    tornado入门大全

    5. **轻量级**:Tornado的设计哲学是简单和轻量,这使得它容易理解和调试,同时也方便与其他Python库集成。 ### 二、安装Tornado 在Python环境中,可以通过pip来安装Tornado: ```bash pip install tornado ``` ...

    用Tornado开发RESTful-API运用

    下面的示例展示了如何在Tornado中处理JSON和JSONP: ```python import tornado.escape class APIHandler(BaseHandler): def finish(self, chunk=None, notification=None): if chunk is None: chunk = {} if ...

    Tornado项目实战

    - **响应**:通过`write()`方法向客户端发送数据,`finish()`表示结束响应。 3. **URL路由**: - **配置**:通过`Application`类的`add_handlers`方法定义URL与RequestHandler的映射。 - **正则表达式**:可以...

    tornado协程示例

    下面给出一个完整的示例代码,展示如何在Tornado中使用协程和线程池来处理并发请求: ```python import concurrent.futures import datetime import urllib.request from concurrent.futures import ...

    Tornado高并发处理方法实例代码

    一旦结果返回,`self.write` 和 `self.finish` 会被调用来完成 HTTP 响应。 另一个处理器 `JustNowHandler` 是一个简单的示例,它不涉及异步操作,直接返回一个简单的字符串。 总结来说,Tornado 高并发处理的关键...

    【Tornado】使用tornado写API的增删改查(一)

    在本教程中,我们将探讨如何使用Tornado框架创建RESTful API来执行数据库的增删改查操作。Tornado是一款轻量级、高性能的Python Web服务器和异步网络库,非常适合构建高并发、实时的Web应用。 首先,确保你已经安装...

    MongoDBGridFS开发库asyncgridfs.zip

    Tornado 非阻塞的 MongoDB GridFS 开发库示例代码:import asyncmongo import tornado.web from asyncgridfs import GridFS class Handler(tornado.web.RequestHandler):  @property  def db(self):  if...

Global site tag (gtag.js) - Google Analytics