tornado的请求与响应

tornado请求与响应相关

一、配置文件config.py 中的settings 有哪些配置:

  • debug:设置tornado是否工作再调试模式下,默认为false 即工作再生产模式下
    • true的特性: tornado 应用会监控源代码文件,当有保存改动时,会重新启动服务器
      • 如果保存后代码有错误,会重启失败,修改后需要手动重启
      • 取消缓存编译的模板--->compiled_template_cache = False 单独设置
      • 取消缓存静态文件的hash值 -->static_hash_cache = False 单独设置
      • 提供追踪信息 --> server_traceback = False 单独设置
      • autoreload = True ==》仅仅用自动重启
  • static_path:设置静态文件目录
  • tempalte_path:设置模板文件目录

二、tornado 中的路由

# -*- coding: utf-8 -*-

import tornado.web

from views import index
import config


class Application(tornado.web.Application):
    def __init__(self):
        handlers = [
            (r'/', index.IndexHandler),
            (r'/login', index.LoginHandler, {'name': 'qzk', 'pwd': '123'}),
            (r'/json', index.JsonResponseHandler),  # 返回json格式的视图
            (r'/header', index.HeaderHandler),  # 修改响应头的视图
            (r'/status', index.StatusHandler),  # 修改状态码的视图
            (r'/redirect', index.RedirectHandler),  # 重定向的视图
            (r'/error/', index.ErrorHandler),  # 自定义错误的状态码以及信息的是视图
        ]
        super(Application, self).__init__(handlers, **config.settings)


# -*- coding: utf-8 -*-
from tornado.web import RequestHandler


class IndexHandler(RequestHandler):
    def get(self, *args, **kwargs):
        self.write("ojbk")

class LoginHandler(RequestHandler):
    def get(self,*args,**kwargs):
        self.write('qwer')

三、利用wirte方法写json数据

  • 注意:自己手动序列化json方式 前端response headers 中的 Content_Type属性text/html,而采用write自动序列化方式,Content_Type属性为application/json
class JsonResponseHandler(RequestHandler):
    def get(self,*args,**kwargs):
        response = {
            "name":"qzk",
            "password":"123"
        }
        self.write(response)
# 上述方式返回的是  json对象类型

import json
class JsonResponseHandler(RequestHandler):
    def get(self,*args,**kwargs):
        response = {
            "name":"qzk",
            "password":"123"
        }
        response_str = json.dumps(response)
        self.write(response_str)
# 上述方式返回的 text/html 对象类型

四、设置响应头(self.set_header(name,value))

  • 作用:设置响应的头文件(手动设置一个名为name,值value的字段)
  • 参数: name ,value
import json
class JsonResponseHandler(RequestHandler):
    def get(self,*args,**kwargs):
        response = {
            "name":"qzk",
            "password":"123"
        }
        response_str = json.dumps(response)
        self.set_header("Content_Type","application/json;charset=UTF-8")
        self.set_header("qzk","dsb")
        self.write(response_str)
响应结果:
Response Headers:
    Content-Length: 34
    Content-Type: application/json;charset=UTF-8
    Date: Mon, 12 Aug 2019 12:14:31 GMT
    Etag: "df54410c9849c29be64aee44631769c071dd82bd"
    Qzk: dsb
    Server: TornadoServer/6.0.2

五、default_headers()-->规范默认修改响应的头的位置

  • 作用:在进入http响应处理方法之前被调用执行的
  • 注意: 在http处理方法中再使用 self.set_headers() 方法 设置通用的name的值,会覆盖原先在set_default_headers() 中设置的值
class HeaderHandler(RequestHandler):
    
    def set_default_headers(self):
        # 默认修改响应的头都在这边修改
        self.set_header("Content-Type", "application/json;charset=UTF-8")
        self.set_header("qzk", "dsb")
    
    def get(self, *args, **kwargs):
        response = {
            "name": "qzk",
            "password": "456"
        }
        response_str = json.dumps(response)
        self.write(response_str)

响应头
Response Headers:
    Content-Length: 34
    Content-Type: application/json;charset=UTF-8
    Date: Mon, 12 Aug 2019 12:25:32 GMT
    Etag: "76512585c844435efcbb60337298886e7e7b9ad3"
    Qzk: dsb
    Server: TornadoServer/6.0.2

六、self.set_status(status_code,reason=None)

  • 作用:为响应设置状态码
  • 参数:
    • status--状态码的值为 int类型
    • reason--对状态码的描述 str类型 如果reason值为None 则状态码的值必须为正常值
# -*- coding: utf-8 -*-
from tornado.web import RequestHandler


class IndexHandler(RequestHandler):
    def get(self, *args, **kwargs):
        self.write("ojbk")


class LoginHandler(RequestHandler):
    
    def initialize(self, name, pwd):
        """该方法在执行get之前先执行"""
        self.name = name
        self.pwd = pwd
    
    def get(self, *args, **kwargs):
        print(self.name, self.pwd)
        self.write(self.name)


import json


class JsonResponseHandler(RequestHandler):
    def get(self, *args, **kwargs):
        response = {
            "name": "qzk",
            "password": "123"
        }
        response_str = json.dumps(response)
        self.set_header("Content-Type", "application/json;charset=UTF-8")
        self.set_header("qzk", "dsb")
        self.write(response_str)


class HeaderHandler(RequestHandler):
    
    def set_default_headers(self):
        # 默认修改响应的头都在这边修改
        self.set_header("Content-Type", "application/json;charset=UTF-8")
        self.set_header("qzk", "dsb")
    
    def get(self, *args, **kwargs):
        response = {
            "name": "qzk",
            "password": "456"
        }
        response_str = json.dumps(response)
        self.write(response_str)


class StatusHandler(RequestHandler):
    
    def set_default_headers(self):
        # 默认修改响应的头都在这边修改
        self.set_header("Content-Type", "application/json;charset=UTF-8")
        self.set_header("qzk", "dsb")
    
    def get(self, *args, **kwargs):
        # self.set_status(404)  # 404 为系统的正常的状态码,reason可以为 None
        self.set_status(999)  # 999 系统不存在该状态码,因此需要设置reason,否则报错
        self.write('**************')
"""
Request URL: http://127.0.0.1:8982/status
Request Method: GET
Status Code: 999 Unknown
Remote Address: 127.0.0.1:8982
Referrer Policy: no-referrer-when-downgrade

服务器端报错: 
ERROR:tornado.access:999 GET /status (127.0.0.1) 1.00ms
"""

七、重定向 -- self.redirect(url)

  • 作用:重定向到url网站
class RedirectHandler(RequestHandler):
    def get(self):
        self.redirect('/')
    
响应头:
General:
    Request URL: http://127.0.0.1:8983/redirect
    Request Method: GET
    Status Code: 302 Found
    Remote Address: 127.0.0.1:8983
    Referrer Policy: no-referrer-when-downgrade

八、self.send_error(status_code=500,**kwargs)

  • 作用:可以跑出http错误状态码,默认为500,跑出错误后tornado会调用write_error()方法处理,并返回给浏览器界面
  • 注意: 在send_error 之下,就不要在响应输出了,不执行之下的内容

九、write_error(status_code,**kwargs)

  • 用来处理send_error跑出来的额信息,并返回给浏览器错误页面
class ErrorHandler(RequestHandler):
    def write_error(self, status_code: int, **kwargs):
        if status_code == 404:
            code = 404
            # 正常情况下返回的自定义的404页面
            self.write('资源部存在')
        elif status_code == 500:
            code = 500
            self.write('服务器错误')
        self.set_status(code)
    
    def get(self, *args, **kwargs):
        flag = self.get_query_argument('flag')
        if flag == '0':
            self.send_error(404)
        self.write('you are sb')

Request URL: http://127.0.0.1:8983/error/?flag=0
Request Method: GET
Status Code: 404 Not Found
Remote Address: 127.0.0.1:8983
Referrer Policy: no-referrer-when-downgrade
原文地址:https://www.cnblogs.com/qianzhengkai/p/11342782.html