zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    C++ P1890 gcd区间
    C++ P1372 又是毕业季I
    C++ CF822A I'm bored with life
    C++ P4057 [Code+#1]晨跑
    C++ CF119A Epic Game
    关于树状数组的几点总结
    markdown语法
    portal开发"下拉框"“日期框”查询要怎么配置
    泛型总结--待续
    Actioncontext跟ServletActionContext的区别---未完待续
  • 原文地址:https://www.cnblogs.com/qianzhengkai/p/11342782.html
Copyright © 2011-2022 走看看