zoukankan      html  css  js  c++  java
  • Tornado 框架的使用

    Tornado

    tornado是一个轻量级python的web框架,他是非阻塞式的,而且速度非常快.得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,这意味着对于实时 Web 服务来说,Tornado 是一个理想的 Web 框架。

    1.最根本的使用

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    import tornado.ioloop
    import tornado.web  
    
    class MainHandler(tornado.web.RequestHandler):
        def get(self):
            self.write("Hello, world")
    
    application = tornado.web.Application([
        (r"/index", MainHandler),
    ])
    
    
    if __name__ == "__main__":
        application.listen(8888)
        tornado.ioloop.IOLoop.instance().start()
    

    2.路由系统

    tornado的路由系统其实就是 url 和 类 的对应关系,这里不同于其他框架,其他很多框架均是 url 对应 函数,Tornado中每个url对应的是一个类。

    application = tornado.web.Application([
        (r"/index", MainHandler),
        (r"/story/([0-9]+)", StoryHandler),
    ])
    
    application.add_handlers('news.baidu.com$', [
        (r'/index',NewsHandler),
    ])
    

    Tornado中原生支持二级域名的路由

    3.模版引擎

    Tornado 的模板支持“控制语句”和“表达语句”,控制语句是使用 {% 和 %} 包起来的

    例如 {% if len(items) > 2 %}。

    表达语句是使用 {{ 和 }} 包起来的,

    例如 {{ items[0] }}。

    Tornado控制语句和对应的 Python 语句的格式基本完全相同。我们支持 if、for、while 和 try,这些语句逻辑结束的位置需要用 {% end %} 做标记。还通过 extends 和 block 语句实现了模板继承。

    在使用模板前需要在setting中设置模板路径:"template_path" : "tpl"

    例如:

    逻辑语句
    <ul>
        {% for item in list_info %}
            <li>{{item}}</li>
        {% end %}
    </ul>
    
    -----------------------------------------   
    继承母版
    {% block RenderBody %}{% end %}
    
    {% block RenderBody %}
    <h1>Index</h1>
    
    在这里写内容
    
    {% end %}
    -----------------------------------------
    
    导入固定的小组件
    {% include 'header.html' %}
    

    在模板中默认提供了一些函数、字段、类以供模板使用:

    escape: tornado.escape.xhtml_escape 的別名
    xhtml_escape: tornado.escape.xhtml_escape 的別名
    url_escape: tornado.escape.url_escape 的別名
    json_encode: tornado.escape.json_encode 的別名
    squeeze: tornado.escape.squeeze 的別名
    linkify: tornado.escape.linkify 的別名
    datetime: Python 的 datetime 模组
    handler: 当前的 RequestHandler 对象
    request: handler.request 的別名
    current_user: handler.current_user 的別名
    locale: handler.locale 的別名
    _: handler.locale.translate 的別名
    static_url: for handler.static_url 的別名
    xsrf_form_html: handler.xsrf_form_html 的別名
    

    当然了,还可以自定义自己的功能

    4.自定义UIMethod以UIModule

    • UIMethod:方便小巧,适合简单的方法

      # uimethods.py
      
      def tab(self):
          return 'UIMethod'
      ------------------------------
      导入和注册
      import uimethods as mt
      
      settings = {
          ......,
          'ui_methods': mt,
      }
      ------------------------------
      使用就很方便了
      {{ tab() }} #记住要加()
      
    • UIModule:模块化,适合组合模块

      from tornado.web import UIModule
      from tornado import escape
      
      class custom(UIModule):
      
          def render(self, *args, **kwargs):
              '''直接返回内容'''
      
          def css_files(self):
              '''返回一个引入式css路径'''
      
          def embedded_css(self):
              '''以字符串的方式返回一个嵌入式的css'''
      
          def javascript_files(self):
              '''返回一个引入式JS路径'''
      
          def embedded_javascript(self):
              '''以字符串的方式返回css语句'''
      
      ------------------------------
      导入和注册
      import uimodules as md
      
      settings = {
          ......,
          'ui_modules': md,
      }
      ------------------------------
      使用
      {% module custom(123) %} # 可以传参
      

    5.静态文件

    对于静态文件,可以配置静态文件的目录和前段使用时的前缀,并且Tornaodo还支持静态文件缓存。

    在设置中写上:

    settings = {
    'template_path': 'template',
    '''模版路径'''
    'static_path': 'static',
    '''实际静态文件路径'''
    'static_url_prefix': '/static/',
    '''静态文件的默认识别前缀,意思是静态文件的路径不管是什么,这要这里写了/static/,
        前端不管真实路径,直接用/static/,tornado会自动查找真实路径'''
    }
    --------------------------------------------
    前端使用
    <link href="/static/example.css" rel="stylesheet" />
    
    为避免出现前缀修改后前端全部都要修改的情况,还可以用一个方法,使前端可以自动生成路径的前缀
    <link href="{{ static_url("example.css") }}" rel="stylesheet" />
    

    6.Cookie

    Tornado中可以对cookie进行操作,并且还可以对cookie进行签名以放置伪造。

    self.set_cookie("mycookie", "myvalue")
    '''设置cookie'''
    self.set_secure_cookie("mycookie", "myvalue")
    '''设置加密cookie'''
    
    设置cookie的时候可以加时间戳参数expires=...,意为到这个时间cookie失效
        或者expires_day=3,则过期时间是3天,同时设置的话expires优先级更高
    
    注意:设置加密cookie的时候,需在setting中设置加密签名
        settings = {
            ......,
            'cookie_secret':'自己填',
        }
    --------------------------------------------
    self.get_cookie('mycookie')
    '''获取cookie'''
    self.get_secure_cookie('mycookie')
    '''获取加密cookie'''
    

    签名Cookie的本质是:

    写cookie过程:

    将值进行base64加密
    对除值以外的内容进行签名,哈希算法(无法逆向解析)
    拼接 签名 + 加密值
    

    读cookie过程:

    读取 签名 + 加密值
    对签名进行验证
    base64解密,获取值内容
    

    7.XSRF

    Tornado中的跨站请求伪造和Django中的相似.

    设置:

    settings = {
        ...
        "xsrf_cookies": True,
    }
    

    使用:

    <form action="/new_message" method="post">
      {{ xsrf_form_html() }}
      <input type="text"/>
    </form>
    
    Ajax使用就在本地获取cookie,携带cookie发送请求
    _xsrf = getCookie("_xsrf")
    

    8.异步非阻塞

    装饰器 + Future 从而实现Tornado的异步非阻塞

    class AsyncHandler(tornado.web.RequestHandler):
    
        @gen.coroutine
        def get(self):
            future = Future()
            future.add_done_callback(self.doing)
            yield future
            # 或
            # tornado.ioloop.IOLoop.current().add_future(future,self.doing)
            # yield future
    
        def doing(self,*args, **kwargs):
            self.write('async')
            self.finish()
    

    当发送GET请求时,由于方法被@gen.coroutine装饰且yield 一个 Future对象,那么Tornado会等待,等待用户向future对象中放置数据或者发送信号,如果获取到数据或信号之后,就开始执行doing方法。

    异步非阻塞体现在当在Tornaod等待用户向future对象中放置数据时,还可以处理其他请求。

    注意:在等待用户向future对象中放置数据或信号时,此连接是不断开的。

    其他

    tornado中的请求的一切都可以在self.request中找到.

    待定

  • 相关阅读:
    quratz数据存储
    quratz线程
    scheduler 基本原理
    一致性哈希算法
    高并发流量控制
    049 DSL语句
    048 SparkSQL自定义UDAF函数
    047 SparkSQL自定义UDF函数
    Quratz的理解
    046 SparlSQL中的函数
  • 原文地址:https://www.cnblogs.com/kimyeee/p/7994004.html
Copyright © 2011-2022 走看看