Tornado输出和响应头
1、输出
在上一篇文章03、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()就是将当前输出缓冲区刷新到网页。
除了上面的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----\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()