Tornado

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

1.最根本的使用

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. import tornado.ioloop
  4. import tornado.web
  5. class MainHandler(tornado.web.RequestHandler):
  6. def get(self):
  7. self.write("Hello, world")
  8. application = tornado.web.Application([
  9. (r"/index", MainHandler),
  10. ])
  11. if __name__ == "__main__":
  12. application.listen(8888)
  13. tornado.ioloop.IOLoop.instance().start()

2.路由系统

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

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

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

3.模版引擎

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

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

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

例如 {{ items[0] }}。

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

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

例如:

  1. 逻辑语句
  2. <ul>
  3. {% for item in list_info %}
  4. <li>{{item}}</li>
  5. {% end %}
  6. </ul>
  7. -----------------------------------------
  8. 继承母版
  9. {% block RenderBody %}{% end %}
  10. {% block RenderBody %}
  11. <h1>Index</h1>
  12. 在这里写内容
  13. {% end %}
  14. -----------------------------------------
  15. 导入固定的小组件
  16. {% include 'header.html' %}

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

  1. escape: tornado.escape.xhtml_escape 的別名
  2. xhtml_escape: tornado.escape.xhtml_escape 的別名
  3. url_escape: tornado.escape.url_escape 的別名
  4. json_encode: tornado.escape.json_encode 的別名
  5. squeeze: tornado.escape.squeeze 的別名
  6. linkify: tornado.escape.linkify 的別名
  7. datetime: Python datetime 模组
  8. handler: 当前的 RequestHandler 对象
  9. request: handler.request 的別名
  10. current_user: handler.current_user 的別名
  11. locale: handler.locale 的別名
  12. _: handler.locale.translate 的別名
  13. static_url: for handler.static_url 的別名
  14. xsrf_form_html: handler.xsrf_form_html 的別名

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

4.自定义UIMethod以UIModule

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

    1. # uimethods.py
    2. def tab(self):
    3. return 'UIMethod'
    4. ------------------------------
    5. 导入和注册
    6. import uimethods as mt
    7. settings = {
    8. ......,
    9. 'ui_methods': mt,
    10. }
    11. ------------------------------
    12. 使用就很方便了
    13. {{ tab() }} #记住要加()
  • UIModule:模块化,适合组合模块

    1. from tornado.web import UIModule
    2. from tornado import escape
    3. class custom(UIModule):
    4. def render(self, *args, **kwargs):
    5. '''直接返回内容'''
    6. def css_files(self):
    7. '''返回一个引入式css路径'''
    8. def embedded_css(self):
    9. '''以字符串的方式返回一个嵌入式的css'''
    10. def javascript_files(self):
    11. '''返回一个引入式JS路径'''
    12. def embedded_javascript(self):
    13. '''以字符串的方式返回css语句'''
    14. ------------------------------
    15. 导入和注册
    16. import uimodules as md
    17. settings = {
    18. ......,
    19. 'ui_modules': md,
    20. }
    21. ------------------------------
    22. 使用
    23. {% module custom(123) %} # 可以传参

5.静态文件

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

在设置中写上:

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

6.Cookie

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

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

签名Cookie的本质是:

写cookie过程:

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

读cookie过程:

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

7.XSRF

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

设置:

  1. settings = {
  2. ...
  3. "xsrf_cookies": True,
  4. }

使用:

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

8.异步非阻塞

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

  1. class AsyncHandler(tornado.web.RequestHandler):
  2. @gen.coroutine
  3. def get(self):
  4. future = Future()
  5. future.add_done_callback(self.doing)
  6. yield future
  7. # 或
  8. # tornado.ioloop.IOLoop.current().add_future(future,self.doing)
  9. # yield future
  10. def doing(self,*args, **kwargs):
  11. self.write('async')
  12. self.finish()

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

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

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

其他

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

待定

Tornado 框架的使用的更多相关文章

  1. python tornado框架实现CRUD

    1.本例采用postgresql数据库,创建数据表 user_tbl ),signup_date date); 2.webapi接口 (1)tornado框架配置 t_tornado.py #-*- ...

  2. python运维开发(二十三)---tornado框架

    内容目录: 路由系统 模板引擎 cookie 加密cookie 自定义api 自定义session 自定义form表单验证 异步非阻塞 web聊天室实例 路由系统 路由系统其实就是 url 和 类 的 ...

  3. python运维开发(二十二)---JSONP、瀑布流、组合搜索、多级评论、tornado框架简介

    内容目录: JSONP应用 瀑布流布局 组合搜索 多级评论 tornado框架简介 JSONP应用 由于浏览器存在同源策略机制,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性. ...

  4. Tornado框架简介

    -------------------简介------------------- 1.概念:     Tornado全称Tornado Web Server,是一个用Python语言写成的Web服务器 ...

  5. tornado框架源码分析---Application类之debug参数

    先贴上Application这个类的源码. class Application(httputil.HTTPServerConnectionDelegate): """A ...

  6. Tornado框架配置使用Jinja2模板引擎

    安装jinja2包 pip install jinja2 定义继承tornado.web.RequestHandler的子类BaseHandler.如果请求处理类继承这个类将会使用jinja模板引擎: ...

  7. tornado框架学习及借用有道翻译api做自动翻译页面

    趁着这几天有时间,就简单的学了一下tornado框架,简单做了个自动翻译的页面 仅为自己学习参考,不作其他用途 文件夹目录结构如下: . ├── server.py ├── static │   └─ ...

  8. tornado框架&三层架构&MVC&MTV&模板语言&cookie&session

    web框架的本质其实就是socket服务端再加上业务逻辑处理, 比如像是Tornado这样的框架. 有一些框架则只包含业务逻辑处理, 例如Django, bottle, flask这些框架, 它们的使 ...

  9. 03: 自定义异步非阻塞tornado框架

    目录:Tornado其他篇 01: tornado基础篇 02: tornado进阶篇 03: 自定义异步非阻塞tornado框架 04: 打开tornado源码剖析处理过程 目录: 1.1 源码 1 ...

  10. tornado框架的get方法传递参数

    tornado框架的get方法传递参数,代码: # encoding: utf-8 """ @version: ?? @author: andu99 @contact: ...

随机推荐

  1. Linux中MySQL中文乱码问题

    一. 问题描述 登录后查看mysql默认编码: mysql> show variables like 'character%'; +--------------------------+---- ...

  2. fopen & fcolse & fseek & ftell & fstat 文件操作函数测试

    1.文件大小查询file_size.c 方法一:fseek + ftell: 方法二:ftell #include <stdio.h> #include <fcntl.h> # ...

  3. Vue 之axios获取Http响应头

    服务器端:Access-Control-Expose-Headers : 'Authorization' 客户端:res.headers.Authorization 引用链接:https://segm ...

  4. 【论文解读】行人检测:What Can Help Pedestrian Detection?(CVPR'17)

    前言 本篇文章出自CVPR2017,四名作者为Tsinghua University,Peking University, 外加两名来自Megvii(旷视科技)的大佬. 文章中对能够帮助行人检测的ex ...

  5. <div class="clear"></div>

    <div class="clear"></div> 这里的clear是样式名.样式写在CSS文件中 从名称来看估计你的样式为:.clear {clear:b ...

  6. 和菜鸟一起学linux内核源码之基础准备篇

    来源:http://blog.csdn.net/eastmoon502136/article/details/8711104 推荐阅读:linux内核源码最初版linux内核源代码,简单易懂,适合初学 ...

  7. 前端学习——jquery操作例子

    一.jquery和DOM函数的转换 . jquery转换成dom $(] . dom转换成jquery var i1=documen.getElementById('#i1')---------> ...

  8. Fire Game 双向bfs

    Fat brother and Maze are playing a kind of special (hentai) game on an N*M board (N rows, M columns) ...

  9. WPF如何用TreeView制作好友列表、播放列表(转)

    WPF如何用TreeView制作好友列表.播放列表 前言 TreeView这个控件对于我来说是用得比较多的,以前做的小聊天软件(好友列表).音乐播放器(播放列表).类库展示器(树形类结构)等都用的是T ...

  10. ehci及其伴随ohci主机控制器驱动分析

    1. 正常插入 插上U盘产生中断调用usb_hcd_irq: usb_hcd_irq ehci_irq usb_hcd_resume_root_hub queue_work(pm_wq, &h ...