官网:http://www.tornadoweb.org/

中文版可以看这里:http://www.tornadoweb.cn/

官方API参考:http://www.tornadoweb.org/en/stable/documentation.html

《Intorduction to Tornado》:http://ishare.iask.sina.com.cn/f/24156048.html

扩充处理     http://www.ltesting.net/ceshi/ceshijishu/xncs/2012/1009/205591.html

来自 http://simpx.me/2011/06/python_tornado_cn/#cookies-and-secure-cookies

内容索引 Table of Contents

  • 概述
  • 下载和安装
    • 安装依赖
  • 模块索引
    • 主要模块
    • 底层模块
    • 其它模块
  • Tornado攻略
    • 请求处理和请求参数
    • RequestHandler中的主要方法
    • 模板
    • Cookies和安全Cookies
    • 用户认证
    • 跨站伪造请求的防范
    • 静态文件和主动式文件缓存
    • 本地化
    • UI模块
    • 非阻塞式的异步请求
    • 第三方认证
  • 关于性能
  • 生产环境下的部署
  • WSGI 和 Google AppEngine
  • 支持

概述

FriendFeed 所使用的 Web 服务器,是一款使用 Python 编写的,相对简单的非阻塞式 Web 服务器。其应用程序所使用的 Web 框架,看起来有些像 web.py 或者是 Google 的 webapp ,但添加了一些有用的工具,并且针对非阻塞式的服务器环境作了特别优化。

Tornado 就是这个 Web 服务器,及其它在 FriendFeed 中常用工具的开源版本。 Tornado 这个框架相较于现在的主流 Web 服务器框架,包括大多数 Python 的框架,给人的感觉都很不一样,因为它的工作方式是非阻塞式的,而且它非常快。得利于其非阻塞的方式和对 epoll 的运用, Tornado 每秒可以处理 1000 个标准连接,在那些对即时性要求很高的 Web 服务应用场合来说, Tornado 无疑是一个很好的选择。我们使用它来处理 FriendFeed 中的那些即时性的功能需求——每一个活动的用户都会一直保持一个对 FriendFeed 服务器的连接。(关于如何处理成千上万的客户端的连接问题,参阅 The C10K problem )

这是经典的 Hello, world 示例:

import tornado.ioloop import tornado.web   class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world")   application = tornado.web.Application([ (r"/", MainHandler), ])   if __name__ == "__main__": application.listen(8888) tornado.ioloop.IOLoop.instance().start() 

查看后面的 Tornado攻略 以了解更多关于 tornado.web 包的细节。

我们努力尝试整理好代码,以最大程度地降低各模块之间的相关性。所以,一般情况下,你可以在项目中独立地使用需要的模块,而不必把整个包都弄进去。

下载和安装

  • 安装依赖
自动安装
Tornado 在 PyPI 的列表当中,你可以使用 pip 或者 easy_install 来自动安装它,当然,别忘了之前先把 libcurl 安装上。查看下面的 安装依赖 一节。注意一点,使用 pip 或 easy_install 安装的 Tornado 并没有包含源代码中的那些 demo 应用。
手动安装
下载 tornado-1.2.1.tar.gz 。

tar xvzf tornado-1.2.1.tar.gz cd tornado-1.2.1 python setup.py build sudo python setup.py install 

Tornado 的代码是托管在GitHub上。对于 Python 2.6 以上的版本,因为标准库中已经包括了对epoll 的支持,所以你可以不用安装,而只是简单地将 tornado 的目录添加到 PYTHONPATH 就可以使用了。

安装依赖

Tornado 在 Pyhton 2.5, 2.6, 2.7 当中都经过了测试。要使用 Tornado 的所有功能,你需要安装PycURL (7.18.2 或更高版本),及 simplejson (仅对 Python 2.5 需要, 2.6 开始,标准库当中已经包括了对 JSON 的支持)。 Mac OS X 及 Ubuntu 中的完整简便安装方法如下:

Mac OS X 10.6 (Python 2.6+)

sudo easy_install setuptools pycurl

Ubuntu Linux (Pyrhon 2.6+)

sudo apt-get install python-pycurl

Ubuntu Linux (Python 2.5)

sudo apt-get install python-dev python-pycurl python-simplejson

模块索引

  • 主要模块
  • 底层模块
  • 其它模块

最重要的一个模块是 web 这个 Web 框架,它包括了 Tornado 的大部分主要功能。其它的模块都是工具性质的,以便让 web 模块更好使用。查看后面的 Tornado攻略 一节了解 web 模块的使用方法。

主要模块

  • web – FriendFeed 使用的 Web 框架,实现了 Tornado 的大多数重要的功能。
  • escape – 关于 XHTML, JSON, URL 编码解码的一些方法。
  • database – 对 MySQLdb 的一个简单封装。
  • template – 基于 Python 的 web 模板系统。
  • httpclient – 被设计用于同 web 和 httpserver 协同工作的非阻塞式 HTTP 客户端。
  • auth – 第三方认证的实现(包括有 Google OpenID/OAuth, Facebook Platform, Yahoo BBAuth, FriendFeed OpenID/OAuth, Twitter OAuth)。
  • locale – 一套本地化、翻译机制。
  • options – 针对服务器环境的命令行、配置文件解析工具。

底层模块

  • httpserver – 服务于 web 模块的一个非常简单的 HTTP 服务器的实现。
  • iostream – 对非阻塞式的常用 socket 读写的简单封装。
  • ioloop – 核心的 I/O 循环。

其它模块

  • s3server – 一个 Web 服务器,实现了 Amazon S3 的大部分接口,依靠本地文件存储实现。

Tornado攻略

  • 请求处理和请求参数
  • RequestHandler中的主要方法
  • 模板
  • Cookies和安全Cookies
  • 用户认证
  • 跨站伪造请求的防范
  • 静态文件和主动式文件缓存
  • 本地化
  • UI模块
  • 非阻塞式的异步请求
  • 第三方认证
  • 支持
因为 FriendFeed ,以及其它的一些基于 Tornado 的大型应用都是运行在 nginx 或者 Apache 代理之后 的,所以,现在 Tornado 的 HTTP 服务部分并不完整,它无法处理多行的头部信息,同时对于一些非标准的输入也无能为力。你可以在 Tornado邮件列表 上讨论和提交 Bug 。 Tornado 是 Facebook’s open source technologies 中的一个,以 Apache Licence, Version 2.0 的方式进行授权。 原文档的许可形式为 Creative Commons 3.0 。

一、Tornado框架概述

Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本。这个Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了能有效利用非阻塞式服务器环境,这个Web 框架还包含了一些相关的有用工具 和优化。

Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,这意味着对于实时 Web 服务来说,Tornado 是一个理想的 Web 框架。我们开发这个 Web 服务器的主要目的就是为了处理 FriendFeed 的实时功能 ——在 FriendFeed 的应用里每一个活动用户都会保持着一个服务器连接。(关于如何扩容 服务器,以处理数以千计的客户端的连接的问题,请参阅 C10K problem。)

import os
import string
import time
import logging
from datetime import datetime

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.httpclient
from tornado.options import define, options

define("port", default=8888, help="run on the given port", type=int)

online = []
count = 0

class MainHandler(tornado.web.RequestHandler):

def get(self):
        self.user = self.get_argument("name", None)
        self.render("templates/stack_p312a.html", title="Online number testing", c_time=datetime.now(), user=self.user)

class LongPollingHandler(tornado.web.RequestHandler):

@tornado.web.asynchronous
    def get(self):
        global online, count
        self.user = self.get_argument("name", None)
        if self.user not in online:
            logging.info("user : " + self.user)
            online.append(self.user)
        http = tornado.httpclient.AsyncHTTPClient()
        appURL = self.request.protocol + "://" + self.request.host
        http.fetch(appURL + "/internal-polling", self._on_finish)

'''push to the client'''
    def _on_finish(self, response):
        if self.request.connection.stream.closed():
            return
        self.write("welcome %s, current online number(s) %s" % (self.user, response.body))
        self.finish()

'''
    def on_connection_close(self):
        TODO, testing
    '''

class InternalPollingHandler(tornado.web.RequestHandler):

'''
    The internal polling for the new online member which will be counted into
    the global online list, and then asynchronously push the latest data to the connected client,keep in a long-polling status.
    '''
    def get(self):
        global online, count
        logging.info("count : " + str(count))
        logging.info("online : " + str(len(online)))
        if count != len(online):
            count += 1
            self.get()
        else:
            self.write(str(count))

def main():
    tornado.options.parse_command_line()

settings = {
        "static_path": os.path.join(os.path.dirname(__file__), "static"),
    }

application = tornado.web.Application([
        (r"/", MainHandler),
        (r"/long-polling", LongPollingHandler),
        (r"/internal-polling", InternalPollingHandler),
        ], **settings
    )
    http_server = tornado.httpserver.HTTPServer(application)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == "__main__":
    main()

二、HelloWorld

上述代码在浏览器中打印一行字符串(Hello, world!)。

  • Tornado框架自身实现了一个HTTP Server,因此不需要额外的Web Server,只需要运行Python脚本即可启动整个应用。
  • 在Tornado框架中,一个URI对应一个RequestHandler,每一个Handler负责处理该URI的HTTP请求,GET、 POST、HEAD等HTTP方法对应Handler的get()、post()、head()等方法,HTTP请求的处理逻辑在相应的方法内实现。 Handler可以看做是Tornado框架里的Controller。
  • RequestHandler的write()方法,将字符串写入Response;render()方法将模板文件写入Response。

三、HelloWorld的进一步扩充

  • define()函数为脚本扩展命令行参数。脚本启动时的参数可以通过python <filename> –help命令查看:


port参数是自定义的启动参数,其它参数均为框架自带的默认启动参数。

  • 使用启动参数的方法如下:

四、静态页面的处理

  • tornado.web.Application类的初始化,handlers是必须传入的固定参数,后面是一个可变长的参数列表。
  • 向handlers列表中添加新元素,即可扩展URL路由表。
  • template_path指定模板文件的所在目录,RequestHandler渲染模板文件时,会自动到该参数指定的目录获取模板文件。例如上述脚本指定template_path的目录为【当前脚本所在目录下的templates目录】,即“./templates”,因此,self.render(“index.html”)方法实际上渲染的是“./templates/index.html”。
  • static_path指定静态文件(img/css/js)的所在目录。在模板文件中,通过static_url()函数访问该目录的文件,如下:

五、数据库的处理

Tornado默认只封装了MySQL的访问接口,访问其它数据库需要使用相应数据库的Python Interface。

在Application类的初始化方法中,添加数据库连接。

在RequestHandler类中添加数据库的访问方法。

在模板文件中,使用RequestHandler传递过来的数据(entries)。

六、表单的处理

在模板文件中,按照通用的HTML方式编写表单即可。

在RequestHandler的相应方法(get/post)中,通过get_argument()函数获取表单提交的数据。

_torn_ado框架相关推荐

  1. ssh(Struts+spring+Hibernate)三大框架整合-简述

    ssh(Struts+spring+Hibernate)三大框架配合使用来开发项目,是目前javaee最流行的开发方式,必须掌握: 注意: 为了稳健起见,每加入一个框架,我们就需要测试一下,必须通过才 ...

  2. Gin 框架学习笔记(03)— 输出响应与渲染

    在 Gin 框架中,对 HTTP 请求可以很方便有多种不同形式的响应.比如响应为 JSON . XML 或者是 HTML 等. ​ Context 的以下方法在 Gin 框架中把内容序列化为不同类型写 ...

  3. Gin 框架学习笔记(02)— 参数自动绑定到结构体

    参数绑定模型可以将请求体自动绑定到结构体中,目前支持绑定的请求类型有 JSON .XML .YAML 和标准表单 form数据 foo=bar&boo=baz 等.换句话说,只要定义好结构体, ...

  4. QT学习之状态机框架

    状态机框架 创建状态机

  5. 【Spring】框架简介

    [Spring]框架简介 Spring是什么 Spring是分层的Java SE/EE应用full-stack轻量级开源框架,以IOC(Inverse Of Control:反转控制)和AOP(Asp ...

  6. 开源自动化机器学习框架

    20211101 在 Airbnb 使用机器学习预测房源的价格 https://blog.csdn.net/weixin_33735077/article/details/87976278?spm=1 ...

  7. Keras框架下的保存模型和加载模型

    在Keras框架下训练深度学习模型时,一般思路是在训练环境下训练出模型,然后拿训练好的模型(即保存模型相应信息的文件)到生产环境下去部署.在训练过程中我们可能会遇到以下情况: 需要运行很长时间的程序在 ...

  8. Adam那么棒,为什么还对SGD念念不忘 (1) —— 一个框架看懂优化算法

    机器学习界有一群炼丹师,他们每天的日常是: 拿来药材(数据),架起八卦炉(模型),点着六味真火(优化算法),就摇着蒲扇等着丹药出炉了. 不过,当过厨子的都知道,同样的食材,同样的菜谱,但火候不一样了, ...

  9. 一个框架看懂优化算法之异同 SGD/AdaGrad/Adam

    Adam那么棒,为什么还对SGD念念不忘 (1) -- 一个框架看懂优化算法 机器学习界有一群炼丹师,他们每天的日常是: 拿来药材(数据),架起八卦炉(模型),点着六味真火(优化算法),就摇着蒲扇等着 ...

最新文章

  1. R缺失值识别、过滤、填充(中位数、KNN、随机森林)
  2. dabs是什么意思_单词flounder是什么中文意思
  3. 【PHP】多线程请求 curl_multi_init()
  4. windows备份0x80070422错误解决方法
  5. matlab实验符号计算答案,实验五matlab符号计算
  6. oracle ebs应用产品安全性-交叉验证规则
  7. [转]在python中删除list中元素的3种方法:remove、pop、del
  8. 腾讯T4梳理的必备笔记:自动化测试必掌握的30个核心知识点
  9. Visual Studio 2017 设置失败、安装失败的解决方法
  10. 你还不懂云计算吗?资深互联网老大详细讲解云计算的应用
  11. 系统动力学模型_049,系统动力学模型,医生是怎么确定用药剂量的
  12. Xftp6的安装与使用
  13. 【Java 微信公众号开发】① 介绍、测试号、接入
  14. 【OpenGL游戏开发之一】MAC OS X And Win7 vs2010 搭建OpenGL
  15. VirtualBox中不能正常使用OpneGL的问题
  16. iOS组件化方案对比
  17. FAR花菜一个前所未有的机遇
  18. php仿淘宝课程设计任务书
  19. c语言指针化简带分数,自动生成四则运算题目(C语言)
  20. 计算机维修要学英文吗,学计算机编程需要英文吗?

热门文章

  1. 静电不静 · 静电解决方法
  2. 如何使用容联SDK,以及如何使用回调简单示例
  3. 比 SQL 还好用,又一门国产数据库语言诞生了
  4. kettle利用时间戳(timestamp)做增量抽取
  5. 微信小店,微店,微盟店,淘宝的区别以及微店和微商城的区别
  6. 高中计算机教师考试内容,教师资格考试:《信息技术学科知识与教学能力》(高级中学)—笔试大纲...
  7. 数据分析 - 用户分析概述(学习笔记)
  8. FATE如何进行本地代码调试
  9. Dockerfile文件万字全面解析
  10. 微信小程序:求职招聘微信小程序源码下载v4.1.78 修复首页授权空白问题