03请求与响应

请求与响应

请求信息

请求

浏览器在发送请求的时候,会发送具体的请求信息,由请求行,请求消息头,请求正文

请求消息头 self.request

向服务器传递附加信息
Accept:  浏览器可以接受的MIME类型。
Accept-Charset: 浏览器支持的字符集,如gbk,utf-8
Accept-Encoding: 浏览器能够解码的数据压缩方式, 如:gzip
Accept-language: 所希望的语言
Host:请求的主机和端口
User-Agent:通知服务器,浏览器类型.
Content-Length:表示请求消息正文的长度
Connection:表示是否需要持久连接(Keep-alive)
Cookie:这是最重要的请求头信息之一(会话有关)

请求行

请求行,位于第一行,包含内容为:
Method: 一般为 GET 或者 POST
Path-to-resource:请求的资源的URI
Http/Version-number:客户端使用的协议的版本,有HTTP/1.0和HTTP/1.1

请求正文

请求具体内容,比如:URL中传入的参数,form表单里面的内容等等

响应信息

响应信息

响应信息为服务器的处理结果。主要包含:响应行,响应消息头,响应正文

响应行

响应行主要报错如下信息:
Http/Version-number:服务器用的协议版本
Statuscode:响应码。代表服务器处理的结果的一种表示,常用的响应码有:
200:正常
302/307:重定向
304:服务器的资源没有被修改
404:请求的资源不存在
500:服务器报错了
message:响应码描述。例如200的描述为OK

响应头

Server: 通知客户端,服务器的类型
Content-Encoding:响应正文的压缩编码方式。常用的是gzip
Content-Length:通知客户端响应正文的数据大小
Content-Type:通知客户端响应正文的MIME类型
Content-Disposition:通知客户端,以下载的方式打开资源

响应正文

具体的响应内容,如html,JavaScript 等数据内容

设置响应头

设置给定响应头set_header

class SetHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        self.write('set_header')
        self.set_header('aaa','111')
import tornado.web
import tornado.ioloop
import tornado.options
import tornado.httpserver

from tornado.options import define,options

define('port',default=8000,type=int,help='port')

class SetHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        self.write('set_header')
        self.set_header('aaa','111')


application = tornado.web.Application(
    handlers=[
        (r'/set',SetHandler),
    ],
    debug = True
)

if __name__ == '__main__':
    tornado.options.parse_command_line()
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.current().start()

页面F12

Aaa: 111
Date: Sun, 12 Aug 2018 04:26:25 GMT
Etag: "f72ba2c63c4104b8ff75a4cca808742285b73105"
Server: TornadoServer/5.1

添加给定响应头add_header

add_header 可以向响应头里面添加信息,而且是可以出现相同信息
class AddHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        self.write('add_header')
        self.add_header('aaa','222')
        self.add_header('aaa', '2223')
import tornado.web
import tornado.ioloop
import tornado.options
import tornado.httpserver

from tornado.options import define,options

define('port',default=8000,type=int,help='port')


class AddHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        self.write('add_header')
        self.add_header('aaa','222')
        self.add_header('aaa', '2223')


application = tornado.web.Application(
    handlers=[
        (r'/add',AddHandler)
    ],
    debug = True
)

if __name__ == '__main__':
    tornado.options.parse_command_line()
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.current().start()

页面F12

Aaa: 222
Aaa: 2223
Date: Sun, 12 Aug 2018 04:24:11 GMT
Etag: "13f1ea7c5874d3adfb58a29519138f45e1a67875"
Server: TornadoServer/5.1

撤销给定响应头clear_header

clear_header 可以撤销给定的响应头信息
class ClearHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        self.write('clear_header')
        self.add_header('aab','222')
        self.add_header('aabc', '2223')
        self.clear_header('aab')
import tornado.web
import tornado.ioloop
import tornado.options
import tornado.httpserver

from tornado.options import define,options

define('port',default=8000,type=int,help='port')


class ClearHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        self.write('clear_header')
        self.add_header('aab','222')
        self.add_header('aabc', '2223')
        self.clear_header('aab')


application = tornado.web.Application(
    handlers=[
        (r'/clear',ClearHandler),
    ],
    debug = True
)

if __name__ == '__main__':
    tornado.options.parse_command_line()
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.current().start()

页面F12

Aabc: 2223
Date: Sun, 12 Aug 2018 04:41:17 GMT
Etag: "89bbdd1f25cadfb072aebaa88bbc1457df7c0be2"
Server: TornadoServer/5.1

发送错误码

发送错误码到浏览器send_error

send_error 可以将指定的 HTTP 错误码发送到浏览器
class SendHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        self.write('send_header')
        self.send_error(404)
import tornado.web
import tornado.ioloop
import tornado.options
import tornado.httpserver

from tornado.options import define,options

define('port',default=8000,type=int,help='port')


class SendHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        self.write('send_header')
        self.send_error(404)

application = tornado.web.Application(
    handlers=[
        (r'/send',SendHandler),
    ],
    debug = True
)

if __name__ == '__main__':
    tornado.options.parse_command_line()
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.current().start()
class SendHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        self.write('send_header')
        # self.flush()
        self.send_error(404)
使用 send_error 时需要注意:
如果已经执行了 flush,则不能再执行 send_error,
因为该方法将简单地终止响应

如果输出已写入但尚未刷新,则将其丢弃并替换为错误页面

实现自定义错误页面 write_error

send_error 在其底层调用的是 write_error

因此只要重写此方法,就可以实现自定义的的错误页面

def write_error(self, status_code, **kwargs):
        self.write('status_code: %s' % status_code)
import tornado.web
import tornado.ioloop
import tornado.options
import tornado.httpserver

from tornado.options import define,options

define('port',default=8000,type=int,help='port')


class SendHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        self.write('send_header')
        self.send_error(404)

    def write_error(self, status_code, **kwargs):
        self.render('error.html')

application = tornado.web.Application(
    handlers=[
        (r'/send',SendHandler),
    ],
    template_path = 'template',
    debug = True
)

if __name__ == '__main__':
    tornado.options.parse_command_line()
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.current().start()

error.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    路由没找到
    您访问的页面不存在
    <img src="https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=1424326754,4004839403&fm=27&gp=0.jpg" alt="">
</body>
</body>
</html>

未定义路由处理

class NotFoundHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        self.send_error(404)

    def write_error(self, status_code, **kwargs):
        self.render('error.html')


 #路由
 (r'/(.*)',NotFoundHandler),
import tornado.web
import tornado.ioloop
import tornado.options
import tornado.httpserver

from tornado.options import define,options

define('port',default=8000,type=int,help='port')


class IndexHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        self.write('hello')


class SetHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        self.write('set_header')
        self.set_header('aaa','111')


class NotFoundHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        self.send_error(404)

    def write_error(self, status_code, **kwargs):
        self.render('error.html')

application = tornado.web.Application(
    handlers=[
        (r'/',IndexHandler),
        (r'/set',SetHandler),  
        (r'/(.*)',NotFoundHandler),
    ],
    template_path = 'template',
    debug = True
)

if __name__ == '__main__':
    tornado.options.parse_command_line()
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.current().start()
注意:需要把此路由放到路由表的最后面

通过这种方式,可以让返回自定义的错误页面

设置状态码set_status

class StatusHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        self.write('set_status')
        self.set_status(200,'haha')
import tornado.web
import tornado.ioloop
import tornado.options
import tornado.httpserver

from tornado.options import define,options

define('port',default=8000,type=int,help='port')


class StatusHandler(tornado.web.RequestHandler):
    def get(self, *args, **kwargs):
        self.write('set_status')
        self.set_status(200,'haha')


application = tornado.web.Application(
    handlers=[
        (r'/status',StatusHandler),
    ],
    template_path = 'template',
    debug = True
)

if __name__ == '__main__':
    tornado.options.parse_command_line()
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.current().start()

页面F12

Request URL: http://127.0.0.1:8000/status
Request Method: GET
Status Code: 200 haha
Remote Address: 127.0.0.1:8000
Referrer Policy: no-referrer-when-downgrade

请求处理过程

import tornado.web
import tornado.ioloop
import tornado.options
import tornado.httpserver

from tornado.options import define,options

define('port',default=8000,type=int,help='port')


class MainHandler(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, *args, **kwargs):
        self.write(' ---get---:处理get请求' + '<br>')
    def post(self, *args, **kwargs):
        self.write(' ---post---:处理post请求' + '<br>')
    def write_error(self, status_code, **kwargs):
        print(' ---write_error---:处理错误')
    def on_finish(self):
        print(' ---on_finish---:结束,释放资源')


application = tornado.web.Application(
    handlers=[
        (r'/main',MainHandler),
    ],
    template_path = 'template',
    debug = True
)

if __name__ == '__main__':
    tornado.options.parse_command_line()
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.current().start()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值