资讯专栏INFORMATION COLUMN

Tornado-04、Tornado输出和响应头

coolpail / 2392人阅读

摘要:就是将当前输出缓冲区刷新到网页。如果输出已写入但尚未刷新,则将其丢弃并替换为错误页面。设置响应的状态代码,参数响应状态码。

Tornado输出和响应头
1、输出

在上一篇文章03、Tornado的输入与输出 对write有了初步的了解
这篇文章我们先来深入了解一下write
首先我们在上一次的tornado文件夹下新建一个lesson3文件夹
实际上,write并没有直接把数据返回给前端,而是先写到缓存区,函数结束之后才会返回到前端。
我们验证如下:
新建start1.py文件 添加完基本的代码后加入以下代码

class FlushHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("11111111111" + "
") self.write("22222222222" + "
") self.write("There comes a flush" + "
") self.flush() import time time.sleep(5) self.write("33333333333" + "
") self.write("There no flush" + "
") self.write("The function is almost over!")

这里我们可以很明显看到,在有无self.flush()的时候,结果是不一样的。如果有的话,就可以先看到前面的输出,没有的话,要等到函数执行完才能够一起打印出来 。self.flush()就是将当前输出缓冲区刷新到网页。

除了上面的self.flush()之外,还有self.finish()需要我们注意,它就类似于函数里面的return,一旦执行,后面就不能再执行self.write,函数原型:

RequestHandler.finish(chunk = None)

在finish函数调用完后,调用write函数会报错

self.finish()
self.write("en~~~~")

报错内容:RuntimeError: Cannot write() after finish()

将给定的HTTP错误发送到浏览器

函数原型:

RequestHandler.send_error(status_code = 500,**kwargs)

如果flush()已经被调用,则不可能发送错误,因此该方法将简单地终止响应。如果输出已写入但尚未刷新,则将其丢弃并替换为错误页面。

覆盖write_error()以自定义返回的错误页面。传递附加的关键字参数
添加下面的Handler

class ErrorHandler(tornado.web.RequestHandler):
    def get(self):
        self.send_error(404)
        # self.flush()
        self.send_error(404)  #如果已经执行 self.flush() 则不会显示错误


覆盖以实现自定义错误页面

函数原型:

RequestHandler.write_error(status_code** kwargs )

write_error可以调用write,render,set_header等,以产生输出。
在ErrorHandler中添加以下代码

def write_error(self, status_code, **kwargs):  # 重写write_error方法
    self.write("---%d----
"%status_code)

通过重写write_error方法,可以实现自定义的输出错误。

设置响应的状态代码

RequestHandler.set_status(status_code,reason = None)

参数:

status_code(int) - 响应状态码。

reason(string) - 描述状态代码的人类可读原因短语。

self.set_status(404,"error")

2.响应头的设置

以谷歌浏览器为例:按下F12,可以打开浏览器自带的控制台,我们选择Network,这里我们可以看到浏览器在页面上没有看到的信息。打开之后刷新一下,选择之后就可以看到:General,Respnse Headers和Request Headers

General:是请求中基本信息,Respnse Headers是相应信息,Request Headers是请求信息,在服务器端可以设置给浏览器的相应信息。
添加以下代码

(r"/header",HeadersHandler),

class HeadersHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("headers")
        self.set_header("hujing",18)
        self.set_header("changsha","hunan")

函数原型:

RequestHandler.set_header(name, value)

如果值不是字符串,我们将其转换为字符串。然后将所有标题值编码为UTF-8

self.set_header可以设置自己的需要的响应头

添加给定的响应头和值

函数原型:

RequestHandler.add_header(*name*, *value*)

不同set_header,add_header可能会多次调用以返回相同键的多个值。相同的键set_header只能返回一个值

self.set_header("hujing","20")  #这里只会显示hujing:20 覆盖了前面的hujing:18
self.add_header("hujing","19")  
self.add_header("changsha","0731")  
self.add_header("changsha","0321") 

撤消先前的set_header调用

有添加,就会有删除,函数原型:

RequestHandler.clear_header(name)


self.clear_header("changsha")

3.相应头的执行顺序
class IndexHandler(tornado.web.RequestHandler):
    def set_default_headers(self):
        print(" ---set_default_headers---:设置header"+"
") def initialize(self): print(" ---initialize---:初始化"+"
") def prepare(self): print(" ---prepare---:准备工作"+"
") def get(self): self.write(" ---get---:处理get请求"+"
") def post(self): self.write(" ---post---:处理post请求"+"
") def write_error(self, status_code, **kwargs): print(" ---write_error---:处理错误"+"
") def on_finish(self): print(" ---on_finish---:结束,释放资源"+"
")

以上便是是一个响应在后台的执行顺序。可以根据需求来实现自己需要的内容。

本文章源码总和

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define, options

define("port", default=9000, help="run port", type=int)


class FlushHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("11111111111" + "
") self.write("22222222222" + "
") self.write("There comes a flush" + "
") self.flush() import time time.sleep(5) self.write("33333333333" + "
") self.write("There no flush" + "
") self.write("The function is almost over!") class ErrorHandler(tornado.web.RequestHandler): def get(self): self.send_error(404) # self.set_status(404, "error") def write_error(self, status_code, **kwargs): # 重写write_error方法 self.write("--%d-- " % status_code) class HeadersHandler(tornado.web.RequestHandler): def get(self): self.write("headers") self.set_header("hujing", 18) self.set_header("changsha", "hunan") self.set_header("hujing", "20") # 1 self.add_header("hujing", "19") # 2 self.add_header("changsha", "0731") # 3 self.add_header("changsha", "0321") # 4 if __name__ == "__main__": tornado.options.parse_command_line() print(options.port) # 打印端口到terminal app = tornado.web.Application( handlers=[ (r"/flush", FlushHandler), (r"/error", ErrorHandler), (r"/header", HeadersHandler), ], template_path="templates", ) http_server = tornado.httpserver.HTTPServer(app) http_server.listen(options.port) tornado.ioloop.IOLoop.instance().start()

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44647.html

相关文章

  • Tornado 4.3文档翻译: web框架-RequestHandlerApplication

    摘要:译者说于年月日发布,该版本正式支持的关键字,并且用旧版本编译同样可以使用这两个关键字,这无疑是一种进步。其次,这是最后一个支持和的版本了,在后续的版本了会移除对它们的兼容。本节最好直接在或者阅读,以获得更好的阅读体验格式支持。 译者说 Tornado 4.3于2015年11月6日发布,该版本正式支持Python3.5的async/await关键字,并且用旧版本CPython编译Torn...

    xiongzenghui 评论0 收藏0
  • Tornado 4.3文档翻译: 用户指南-web应用的结构

    摘要:译者说于年月日发布,该版本正式支持的关键字,并且用旧版本编译同样可以使用这两个关键字,这无疑是一种进步。其次,这是最后一个支持和的版本了,在后续的版本了会移除对它们的兼容。 译者说 Tornado 4.3于2015年11月6日发布,该版本正式支持Python3.5的async/await关键字,并且用旧版本CPython编译Tornado同样可以使用这两个关键字,这无疑是一种进步。其次...

    LinkedME2016 评论0 收藏0

发表评论

0条评论

coolpail

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<