Tornado-0四、Tornado输出和响应头

Tornado输出和响应头


一、输出

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

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

图片描述

图片描述

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

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

RequestHandler.finish(chunk = None)浏览器

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

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

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

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

函数原型:less

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

若是flush()已经被调用,则不可能发送错误,所以该方法将简单地终止响应。若是输出已写入但还没有刷新,则将其丢弃并替换为错误页面。函数

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

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----\n"%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'+'<br>')

    def initialize(self):
        print(' ---initialize---:初始化'+'<br>')

    def prepare(self):
        print(' ---prepare---:准备工做'+'<br>')

    def get(self):
        self.write(' ---get---:处理get请求'+'<br>')

    def post(self):
        self.write(' ---post---:处理post请求'+'<br>')

    def write_error(self, status_code, **kwargs):
        print(' ---write_error---:处理错误'+'<br>')

    def on_finish(self):
        print(' ---on_finish---:结束,释放资源'+'<br>')

以上即是是一个响应在后台的执行顺序。能够根据需求来实现本身须要的内容。

本文章源码总和

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' + '<br>')
        self.write('22222222222' + '<br>')
        self.write('There comes a flush' + '<br>')
        self.flush()
        import time
        time.sleep(5)
        self.write('33333333333' + '<br>')
        self.write('There no flush' + '<br>')
        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--\n" % 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()
相关文章
相关标签/搜索