文档章节

python模块介绍-Tornado:Tornado中文文档-概述

磁针石
 磁针石
发布于 2015/06/07 08:54
字数 1816
阅读 5813
收藏 15
点赞 0
评论 0

快速链接

快速入门

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world\n")

application = tornado.web.Application([(r"/", MainHandler),])

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

用浏览器或者curl等访问http://localhost:8888/,会返回"Hello, world"。

# 服务器端执行
$ python test.py 
WARNING:tornado.access:404 GET /favicon.ico (127.0.0.1) 0.81ms
WARNING:tornado.access:404 GET /favicon.ico (127.0.0.1) 0.81ms
# 客户端执行
$ curl  
Hello, world

这个例子没有用到Tornado的异步功能,异步的实例参见chatdemo.py

Introduction-to-Tornado中介绍的实例稍微复杂点:

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define, options
define("port", default=8888, help="run on the given port", type=int)
class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        greeting = self.get_argument('greeting', 'Hello')
        self.write(greeting + ', friendly user!')
if __name__ == "__main__":
    tornado.options.parse_command_line()
    app = tornado.web.Application(handlers=[(r"/", IndexHandler)])
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

执行结果:

# 服务器端执行
$ python hello.py --port=8000
[I 150525 08:41:53 web:1825] 200 GET / (127.0.0.1) 0.85ms
[I 150525 08:42:26 web:1825] 200 GET /?greeting=Salutations (127.0.0.1) 0.68ms
# 客户端执行
$ curl http://localhost:8000/
Hello, friendly user!
$ curl http://localhost:8000/?greeting=Salutations
Salutations, friendly user!

这里增加了tornado.options.parse_command_line()用于解析http参数。上例中用application.listen(8888)直接启动http服务,这里改为用tornado.httpserver.HTTPServer启动。

Introduction-to-Tornado中字符串实例如下:

import textwrap

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
            
from tornado.options import define, options
define("port", default=8888, help="run on the given port", type=int)

    class ReverseHandler(tornado.web.RequestHandler):
    def get(self, input):
        self.write(input[::-1] + '\n')class WrapHandler(tornado.web.RequestHandler):
    def post(self):
        text = self.get_argument('text')
        width = self.get_argument('width', 40)
        self.write(textwrap.fill(text, int(width)) + '\n')

if __name__ == "__main__":
    tornado.options.parse_command_line()
    app = tornado.web.Application(handlers=[
        (r"/reverse/(\w+)", ReverseHandler),
        (r"/wrap", WrapHandler)
    ])
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

执行结果:

# 服务器端执行
$ python string_service.py --port=8000
[I 150525 09:01:18 web:1825] 200 GET /reverse/stressed (127.0.0.1) 0.56ms
[I 150525 09:01:24 web:1825] 200 GET /reverse/slipup (127.0.0.1) 0.65ms
[I 150525 09:01:59 web:1825] 200 POST /wrap (127.0.0.1) 1.89ms
[I 150525 09:02:14 web:1825] 200 POST /wrap (127.0.0.1) 0.97ms

# 客户端执行
$ curl http://localhost:8000/reverse/stressed
desserts
$ curl http://localhost:8000/reverse/slipup
pupils
$ curl http://localhost:8000/wrap -d text=Lorem+ipsum+dolor+sit+amet,+consectetuer+adipiscing+elit.Lorem ipsum dolor sit amet, consectetuer
adipiscing elit.
$ curl http://localhost:8000/wrap -d text=hello
hello

在上面的代码中,Application类在"handlers"参数中实例化了两个RequestHandler类对象。

"/reverse/(\w+)"中,正则表达式告诉Tornado匹配任何以字符串/reverse/开始并紧跟着一个或多个字母的路径。括号的含义是 让Tornado保存匹配括号里面表达式的字符串,并将其作为请求方法的一个参数传递给RequestHandler类。“get(self, input):”中有一个额外的参数input。这个参数将包含匹配处理函数正则表达式第一个括号里的字符串, 如果正则表达式中有一系列额外的括号,匹配的字符串将被按照在正则表达式中出现的顺序作为额外的参数传递进来。

WrapHandler类处理匹配路径为/wrap的请求。这个处理函数定义了一个post方法,也就是说它接收HTTP的POST方法的请求。Tornado可以解析URLencoded和multipart结构的POST请求。

常见的读写数据库可以结合post和get实现,比如(非实际可执行的例子):

# matched with (r"/widget/(\d+)", WidgetHandler)class WidgetHandler(tornado.web.RequestHandler):
    def get(self, widget_id):
        widget = retrieve_from_db(widget_id)
        self.write(widget.serialize())

    def post(self, widget_id):
        widget = retrieve_from_db(widget_id)
        widget['foo'] = self.get_argument('foo')
        save_to_db(widget)

HTTP请求(GET、POST、PUT、DELETE、HEAD、OPTIONS)可以非常容易地定义,只需要在RequestHandler类中使用 同名的方法。下面是另一个想象的例子,在这个例子中针对特定frob ID的HEAD请求只根据frob是否存在给出信息,而GET方法返回整个对象:

# matched with (r"/frob/(\d+)", FrobHandler)class FrobHandler(tornado.web.RequestHandler):
    def head(self, frob_id):
        frob = retrieve_from_db(frob_id)
        if frob is not None:
            self.set_status(200)
        else:
            self.set_status(404)

    def get(self, frob_id):
        frob = retrieve_from_db(frob_id)
        self.write(frob.serialize())

使用RequestHandler类的set_status()方法显式地设置HTTP状态码。然而,你需要记住在某些情况下,Tornado会自动地设置HTTP状态码。下面是一个常用情况的纲要:

  • 404 Not Found: Tornado会在HTTP请求的路径无法匹配任何RequestHandler类相对应的模式时返回404(Not Found)响应码。

  • 400 Bad Request: 如果你调用了一个没有默认值的get_argument函数,并且没有发现给定名称的参数,Tornado将自动返回一个400(Bad Request)响应码

  • 405 Method Not Allowed: 如果传入的请求使用了RequestHandler中没有定义的HTTP方法(比如,一个POST请求,但是处理函数中只有定义了get方 法),Tornado将返回一个405(Methos Not Allowed)响应码。

  • 500 Internal Server Error: 当程序遇到任何不能让其退出的错误时,Tornado将返回500(Internal Server Error)响应码。你代码中任何没有捕获的异常也会导致500响应码。

  • 200 OK: 如果响应成功,并且没有其他返回码被设置,Tornado将默认返回一个200(OK)响应码。

错误发生时Tornado将默认向客户端发送一个包含状态码和错误信息的简短片段。 可以在你的RequestHandler重载write_error方法自定义错误信息,比如:

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web

from tornado.options import define, options
define("port", default=8888, help="run on the given port", type=int)

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        greeting = self.get_argument('greeting', 'Hello')
        self.write(greeting + ', friendly user!')
        
    def write_error(self, status_code, **kwargs):
        self.write("Gosh darnit, user! You caused a {0} error.\n".format(
            status_code))

if __name__ == "__main__":
    tornado.options.parse_command_line()
    app = tornado.web.Application(handlers=[(r"/", IndexHandler)])
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

执行结果:

# 服务器端执行
$ python hello-error.py --port=8000
[W 150525 09:58:29 web:1825] 405 POST / (127.0.0.1) 1.39ms

# 客户端执行
$ curl -d foo=bar http://localhost:8000/
Gosh darnit, user! You caused a 405 error.

安装

自动安装:

# pip install tornado

PyPI中包含Tornado,可以通过pip或easy_install来安装。这种方式没有包含源代码中的demo程序,下载的源码包可以解决该问题。

手动安装:

# wget https://pypi.python.org/packages/source/t/tornado/tornado-4.1.tar.gz
# tar xvzf tornado-4.1.tar.gz
# cd tornado-4.1
# python setup.py build
# sudo python setup.py install

预置条件:Tornado支持Python2.6、2.7、3.2、3.3和3.4。依赖certifi,Python 2还依赖backports.ssl_match_hostname,pip或easy_install自动安装依赖。有些Tornado特性可能依赖以下库:

  • unittest2: 在Python2.6执行test suite需要。

  • concurrent.futures: Tornado推荐的线程池,允许使用ThreadedResolver。Python 2需要,Python3中标准库已经包含该功能。

  • pycurl:tornado.curl_httpclient中选择是否使用。要求用7.18.2或更高版本,建议7.21.1或更高版本。

  • twisted: tornado.platform.twisted类可能用到。

  • pycares: 当线程是不适合时用作非阻塞DNS解析器。

  • Monotime: 增加单调时钟,在时钟调整频繁环境中提高可靠性。在Python 3.3不再需要。

平台:Tornado运行在类unix平台,最佳的性能和扩展性体现在Linux(epoll)和BSD(kqueue)(尽管Mac OS X上源于BSD且支持的kqueue,它的网络性能较差,因此只建议用于开发)。Tornado也可在Windows上运行,但不是官方支持和建议仅供开 发使用。

授权:Tornado是Facebook开源的一部分,基于Apache License 2.0。文档基于Creative Commons 3.0。


参考资料


© 著作权归作者所有

共有 人打赏支持
磁针石
粉丝 175
博文 72
码字总数 314278
作品 0
邵阳
QA/测试工程师
python-成长之路

一系列python方面有价值的参考/跟python有关的东西 http://www.path8.net/tn/archives/6017 Tools PyCharm – 来自JetBrains的强大的IDE Python Tools for Visual Studio Eclipse + pydev Ap......

_Mr_Computer_ ⋅ 2016/07/01 ⋅ 0

PYTHON资源入口汇总

官网 入口 官方文档 英文 document 2.7.6 入口| 标准库 document 3.x 入口 The Hitchhiker’s Guide to Python 入口 Python Monk 入口 中文 document 2.7 入口 非官方 google的python文档 Go...

好铁 ⋅ 2016/02/12 ⋅ 0

Tornado学习笔记(二)

我一直用python2.x,python2.x内置的字符编码方式是unicode,这就对中文的处理造成了一些困扰,尤其是在用tornado写json接口的时候,如果不做处理,出来的没有中文,都是x4d5f之类的东西。所...

Slaytanic ⋅ 2015/07/13 ⋅ 0

学习网址

参考http://blog.51cto.com/lvnian/1840198 Python: 廖雪峰:http://www.liaoxuefeng.com Python中文官方文档:http://python.usyiyi.cn/translate/python_278/tutorial/index.html Python......

liqius ⋅ 2017/11/29 ⋅ 0

Python学习资料篇

Python学习资料网络上比较多,看到好的资源,不及时记录下来,下次就找不到了,我把知乎上好的回到收藏汇总到这里,以便自己随时查看,包括Python入门书籍,网站,项目,官方文档,下载资源等...

BjarneCpp ⋅ 2017/12/03 ⋅ 0

信息统计DashBoard踩坑总结

最近根据需求用Tornado框架在写了一个从数据库统计Redis服务器的数量、内存等信息的接口,并写了一个从接口获取数据并推送至grafana进行展示的程序。现在已经实现所有功能,现将实现过程中遇...

帅宇 ⋅ 2017/08/28 ⋅ 0

开源电子书

目录 语言无关类 操作系统 智能系统 分布式系统 编译原理 函数式概念 计算机图形学 WEB服务器 版本控制 编辑器 NoSQL PostgreSQL MySQL 管理和监控 项目相关 设计模式 Web 大数据 编程艺术 ...

zting科技 ⋅ 2017/12/11 ⋅ 0

Python学习之路目录(收藏整理)

目录 Python之路【第一篇】:Python简介和入门 Python之路【第二篇】:Python基础(一) Python之路【第三篇】:Python基础(二) Python之路【第四篇】:模块 pip 的源使用国内的源 pip源配...

湖北蒋文辉 ⋅ 2016/11/06 ⋅ 0

在Jupyter Notebook中增加Python内核

本人在Python 3.6的环境下,安装了Jupyter 进入到Jupyter Notebook后,点击Kernel菜单的Change kernel子菜单,只看到只有一个Python 3。如果这时想要增加Python 2的内核(Python 2.7),可通...

雪饼 ⋅ 06/07 ⋅ 0

Python学习路线(针对具备一定编程经验者)

相比C,C++,JAVA等编程语言,Python是易学的。但要想深入地理解Python,并熟练地编写Python风格的Python代码。我想还是有一长段路程要走的。下面即是我的一点经验总结,主要是为了整理自己学习...

Thebreezecomes ⋅ 2014/04/23 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Centos7重置Mysql 8.0.1 root 密码

问题产生背景: 安装完 最新版的 mysql8.0.1后忘记了密码,向重置root密码;找了网上好多资料都不尽相同,根据自己的问题总结如下: 第一步:修改配置文件免密码登录mysql vim /etc/my.cnf 1...

豆花饭烧土豆 ⋅ 49分钟前 ⋅ 0

熊掌号收录比例对于网站原创数据排名的影响[图]

从去年下半年开始,我在写博客了,因为我觉得业余写写博客也还是很不错的,但是从2017年下半年开始,百度已经推出了原创保护功能和熊掌号平台,为此,我也提交了不少以前的老数据,而这些历史...

原创小博客 ⋅ 今天 ⋅ 0

LVM讲解、磁盘故障小案例

LVM LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。 1.新建分区,更改类型为8e 即L...

蛋黄Yolks ⋅ 今天 ⋅ 0

Hadoop Yarn调度器的选择和使用

一、引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器之前先简单了解一下Yarn的架构。 上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负...

p柯西 ⋅ 今天 ⋅ 0

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 今天 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 2

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

创建新用户和授予MySQL中的权限教程

导读 MySQL是一个开源数据库管理软件,可帮助用户存储,组织和以后检索数据。 它有多种选项来授予特定用户在表和数据库中的细微的权限 - 本教程将简要介绍一些选项。 如何创建新用户 在MySQL...

问题终结者 ⋅ 昨天 ⋅ 0

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部