Tornado输出和响应头
1.输出
再来看看输出`write`,实际上,`write`并没有直接把数据返回给前端,而是先写到缓存区,函数结束之后才会返回到前端,我们验证如下
class FlushHandler(tornado.web.RequestHandler):
def get(self):
self.write('this is '+'<br>')
self.write('tornado'+'<br>')
self.flush()
import time
time.sleep(5)
self.write('hahaha')
self.flush()
self.write('en~~~~')
这里我们可以很明显看到,在有无`self.flush()`的时候,结果是不一样的。如果有的话,就可以先看到前面的输出,没有的话,要等到函数执行完才能够一起打印出来 。`self.flush()`就是将当前输出缓冲区刷新到网络。
除了上面的`self.flush()`之外,还有`self.finish()`需要我们注意,它就类似于函数里面的`return`,一旦执行,后面就不能再执行`self.write`,函数原型:
[`RequestHandler.finish(chunk = None)`](http://www.tornadoweb.org/en/stable/_modules/tornado/web.html#RequestHandler.finish)
在finish函数调用完后,调用write函数会报错
self.finish()
self.write('en~~~~')
**将给定的HTTP错误发送到浏览器**
[`RequestHandler.send_error(status_code = 500,**kwargs) `](http://www.tornadoweb.org/en/stable/_modules/tornado/web.html#RequestHandler.send_error)
如果[`flush()`](http://www.tornadoweb.org/en/stable/web.html#tornado.web.RequestHandler.flush)已经被调用,则不可能发送错误,因此该方法将简单地终止响应。如果输出已写入但尚未刷新,则将其丢弃并替换为错误页面。
覆盖[`write_error()`](http://www.tornadoweb.org/en/stable/web.html#tornado.web.RequestHandler.write_error)以自定义返回的错误页面。传递附加的关键字参数
self.send_error(404) #如果已经执行 self.flush() 则不会不能显示错误
**覆盖以实现自定义错误页面**
函数原型:
[`RequestHandler.write_error(*status_code*,**\* kwargs *)`](http://www.tornadoweb.org/en/stable/_modules/tornado/web.html#RequestHandler.write_error)
`write_error`可以调用[`write`](http://www.tornadoweb.org/en/stable/web.html#tornado.web.RequestHandler.write),[`render`](http://www.tornadoweb.org/en/stable/web.html#tornado.web.RequestHandler.render),[`set_header`](http://www.tornadoweb.org/en/stable/web.html#tornado.web.RequestHandler.set_header)等,以产生输出。
def write_error(self, status_code, **kwargs):
self.write("---%d----\n"%status_code)
通过重写`write_error`方法,可以实现自定义的输出错误。
**设置响应的状态代码**
[`RequestHandler.set_status(status_code,reason = None)`](http://www.tornadoweb.org/en/stable/_modules/tornado/web.html#RequestHandler.set_status)
参数:
\- 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('budong',18)
self.set_header('changsha','hunan')
函数原型:
[`RequestHandler.set_header(name, value)`](http://www.tornadoweb.org/en/stable/_modules/tornado/web.html#RequestHandler.set_header)
如果值不是字符串,我们将其转换为字符串。然后将所有标题值编码为UTF-8
`self.set_header`可以设置自己的需要的响应头
**添加给定的响应头和值**
函数原型:
[`RequestHandler.add_header(*name*, *value*)`](http://www.tornadoweb.org/en/stable/_modules/tornado/web.html#RequestHandler.add_header)
不同[`set_header`](http://www.tornadoweb.org/en/stable/web.html#tornado.web.RequestHandler.set_header),[`add_header`](http://www.tornadoweb.org/en/stable/web.html#tornado.web.RequestHandler.add_header)可能会多次调用以返回相同键的多个值。相同的键`set_header`只能返回一个值
self.set_header('jingqi','20')
self.add_header('jingqi','19')
self.add_header('jingjing','0731')
**撤消先前的set_header调用**
有添加,就会有删除,函数原型:
[`RequestHandler.clear_header`(*name*)](http://www.tornadoweb.org/en/stable/_modules/tornado/web.html#RequestHandler.clear_header)
self.clear_header('changsha')
**相应头的执行顺序**
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>')
最新文章
- Public key for mysql....rpm is not installed
- ASP.net 常用服务器控件
- cmd 更改字体
- java多线程之CAS
- 自定义控件winfrom
- Domain many-to-many
- [liu yanling]测试用例设计综合策略
- 动态网页技术---JSP
- SharePoint Attachement操作代码
- linux 声音大小调整的命令
- document.body的一些用法以及js中的常见问题
- X64系统下IIS运行ASP网站HTTP500错误 【安装FoxMail Server时出现】
- 天梯赛-L1-018. 大笨钟
- pycharm 安装及使用
- 【洛谷P2746】Network of Schools
- Bossies 2015: The Best of Open Source Software Awards
- 【JUnit】@Test 报错,";Test cannot be resolved to a type";
- javascript的面向对象思想知识要点
- 使用Quartz.net来执行定时任务
- 基于UML的毕业设计管理系统的分析与设计