美文网首页
基础掌握点

基础掌握点

作者: 好小葱1 | 来源:发表于2018-09-09 19:11 被阅读8次

    路由解析

    handlers = [
        ('/', MainHandler),
        ('/entry', EntryHandler),
        (r'/entry/([(^/)+])', EntryHandler1),      # 路径中的参数部分用小括号'()'标识     
        (r'/entry/([(^/)*])', EntryHandler2)       # 带默认值的参数路径
    ]
    
    # 第四个路由对应的handler如下所示
    class EntryHander2(tornado.web.RequestHandler):
        def get(self, slug='default'):
            pass
    

    RequestHandler

    配置和响应URL请求的核心类

    1. 接入点函数

      • RequestHandler.intialize()
        • 实现RequestHandler子类实例测初始化过程
      • RequestHandler.prepare()RequestHandler.on_finish()
        • prepare()——用于调用Action函数之前的初始化处理,可以做资源初始化操作。
        • on_finish()——用于请求处理结束后的一些清理工作,可做清理对象占用的内存或者关闭数据库连接等工作。
      • HTTP Action处理函数
    2. 输入捕获

      • RequestHandler.get_argument(name)RequestHander.get_arguments(name)
        获得单个值;获取多个值,返回多个值的列表。
        用来获取的是(1)URL查询字符串参数(2)Post提交参数的参数合集。
      • RequestHandler.get_cookie(name, default=None)
        根据Cookie名称获取Cookie值。
      • RequestHandler.request
        返回tornado.httputil.HTTPServerRequst对象实例,该实例常用的属性如下表:
        属性名 说明
        method 请求方法
        uri 客户端请求的uri的完整内容
        path uri路径名,即不包含查询字符串
        query uri中的查询字符串
        version 客户端发送请求时使用的HTTP版本
        headers 以字典方式表达的HTTP Headers
        body 以字符串方式表达的HTTP消息体
        remote_ip 客户端的IP地址
        protocol 请求协议,如HTTP、HTTPS
        host 请求消息体中的主机名
        arguments 客户端提交的所有参数
        files 以字典形式表达的客户端上传的文件,每个文件名对应一个HTTPFile
        cookies 客户端提交的Cookie字典
    3. 输出响应函数

      • RequestHandler.set_status(status_code, reason=None)

      • RequestHandler.set_header(name, value)

        class DetailHandler(tornado.web.RequestHandler):
            def get():
                self.set_header('NUMBER', 9)
                self.set_header('LANGUAGE', 'France')
                self.set_header('LANGUAGE', 'Chinese')   # 会覆盖上一个LANGUAGE的值
        
      • RequestHandler.add_handler(name, value)
        不会像上面产生覆盖的情形

      • RequestHandler.write(chunk)
        将给定的块作为HTTP Body发送给客户端。如果给定的块是个字典,则会将这个块以JSON的格式发送给客户端,同时将HTTP Header中的Content_Type设置成application/json

      • RequestHandler.finish(chunk=None)
        通知Tornado:Response的生成工作已经完成,调用finish()后,将向客户端发送HTTP Response。本方法适用于对RequestHandler的异步请求处理。

        注意:在同步或协程访问处理的函数中,无须调用finish()函数

      • RequestHandler.clear()
        清空所有在本次请求中之前写入的HeaderBody内容。

      • RequestHandler.set_cookie(name, value)

      • RequestHandler.clear_all_cookies(path='/', domain=None)
        清空本次请求中的所有Cookie


    协程化

    协程结合了同步处理和异步处理的优点,使代码清晰易懂,又能适应海量客户端的高并发请求。

     import tornado.web
     import tornado.httpclient
     
     class MainHandler(tornado.web.RequestHandler):
         @tornado.gen.coroutine    # 装饰处理函数
         def get(self):
             http = tornado.httpclient.AsynHTTPClient()
             # 使用yield关键字获取一步对象的处理结果
             response = yield http.fetch('http://www.baidu.com')
             self.write(response.body)
    

    安全Cookie机制

    Cookie是很多网站为了辨别用户身份而储存在用户本地终端的数据,比如保存Session信息。
    如何保证其不备篡改是服务器端程序必须解决的问题,Tornado提供了为Cookie信息加密的机制,是的客户端无法随意解析和修改Cookie的键值。

    import tornado.web
    import tornado.ioloop
    
    session_id = 1
    
    class MainHandler(tornado.web.RequestHandler):
       def get(self):
           global session_id
           # get_cookie() -> get_secure_cookie()
           if not self.get_secure_cookie('session'):
               # set_cookie() -> set_secure_cookie()
               self.set_secure_cookie('session', str(session_id))
               session_id = session_id + 1
           else:
               pass
    
    application = tornado.web.Application([
       (r'/', MainHandler),
    ], cookie_secret="SECRET_DONT_LEAK")   # 参数值是字符串,用于保存本网站Cookie加密时的密钥。
    
    def main():
       application.listen(8888)
       tornado.ioloop.IOLoop.current().start()
    
    if __name__ == '__main__':
       main()
    

    相关文章

      网友评论

          本文标题:基础掌握点

          本文链接:https://www.haomeiwen.com/subject/ajldgftx.html