Tornado web server 初体验

本文介绍了Tornado,一个由FriendFeed开发的高性能、可扩展的非阻塞式Web服务器。通过手动安装过程和HelloWorld示例展示了Tornado的基本用法,包括定义RequestHandler子类来处理HTTP请求。此外,还探讨了Tornado的性能测试和在128M VPS上的部署配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

附加链接:

 

Tornado源码分析之http服务器篇

 

 

1. Tornado 是什么?

Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本。

详见官网:http://www.tornadoweb.org/en/stable/


2. 在ubuntu下安装Tornado并测试官网给出的HelloWorld程序

2.1 自动安装

命令: pip intstall tornado

由于我刚开始使用Python的下载工具pip来下载tornado,但是后面运行HelloWorld程序出现了错误,大概如官网所说,

需要将tornado加入到环境变量PYTHONPATH。

可惜我不知道pip下载tornado后把它保存在哪里,也不太清楚怎么设置PYTHONPATH。

2.2 手动安装

下载 tornado-3.1.tar.gz:

tar xvzf tornado-3.1.tar.gz
cd tornado-3.1
python setup.py build
sudo python setup.py install
 在tornado-3.1目录中有一个demos文件夹,进入demos,其中有一个helloworld文件夹,里面只有一个python脚本helloworld.py,

在命令行中执行python helloworld.py

然后在浏览器中输入 http://localhost:8888/

如果一切正常,浏览器会显示Hello, world


关于helloworld.py的脚本解释,详见如下。

 


Tornado是一个强大而可伸缩的web服务器,用Python语言开发而成。虽然是轻量级的,但是他很健壮,可以应用于正式的多种应用和工具。

Tornado是基于一个叫公司FriendFeed开发的web框架,起初由Bret Taylor等人开发的,后来,在他们要求下,代码开源了。商业的web框架最多可以同时具有10000个连接,而Tornado开发目标是解决大规模并发网络(C10K Problem)问题的高性能web框架。它还包括了安全处理、用户认证、社交网络、异步模式及数据库、web接口函数的扩展服务。

自2009年10月发布以来,获得许多团体支持,并被应用于各种不同的目标。除了FriendFeed和Facebook之外,很多公司在生产中开始转向Tornado,包括Quora、Turntable.fm、 Bit.ly、Hipmunk和 MyYearbook。

简单地说,如果你正在寻求大型CMS或大而慢的开发框架,Tornado不会是你的选择。Tornado并不要求你以特别的形式建立大型模型或一定风格的处理形式。你可以做到敏捷开发。你要创建可伸缩而友好的应用、实时的分析引擎或RESTful API,用这个框架是很好的选择。

Tornado起步

在类Linux系统中安装很容易,可以用PyPI获取,也可以从Github下载源代码,用以下命令安装:

$ curl -L -Ohttp://github.com/downloads/facebook/tornado/tornado-2.1.1.tar.gz

$ tar xvzf tornado-2.1.1.tar.gz

$ cd tornado-2.1.1

$ python setup.py build

$ sudo python setup.py install

它没有windows系统的官方支持,但可以通过ActivePython的PyPM包管理器安装:

C:\> pypm install tornado

安装时,会带有演示模块。它包括建立博客、集成用来运行聊天服务的Facebook等。后面章节将一步一步地讲解一些例子。

简易web服务器

前文已经简单介绍了Tornado,下面将开始如何用Tornado写一个基础的web服务器。

Hello Tornado实例

Tornado是个可以用来写HTTP请求应答的框架。作为程序员,你需要编写匹配一个特别形式的HTTP请求应答。以下是一个全功能Tornado应用实例程序:


import tornado.httpserver

import tornado.ioloop

import tornado.options

import tornado.web

from tornado.options importdefine, options

define("port",default=8000, 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 + ', friendlyuser!')

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()


写Tornado应用基本工作就是定义RequestHandler的子类。本例中,我们编写了一个简单的侦听给定端口号并应答根请求的应用。

而后在命令行下输入以下命令来测试:

   $ python hello.py --port=8000

现在在浏览器中浏览http://localhost:8000/地址,或再开一个终端窗口来测试:

   $ curl http://localhost:8000/

     Hello, friendly user!

   $ curl http://localhost:8000/?greeting=Salutations

     Salutations, friendly user!

下面分代码块一句一句分析:

   import tornado.httpserver

   import tornado.ioloop

   import tornado.options

   import tornado.web

程序开始,导入多个Tornado助手库。其中,还包括有其它的一些包,但至少需要导入以下四个才能使本演示实例运行:

from tornado.options importdefine, options

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

为读取命令行参数,Tornado包中含有助手库(tornado.options)。本例中使用它可以让我们特别指定HTTP服务端口。它是这样工作的:在define语句中给出选项参数会成为全局options对象,否则选项参数在命令行中以相同的名字给出。如果用户带--help参数运行程序,程序会输出定义的所有选项提示。如果用户没有提供我们定义参数的值,默认值会自动应用。Tornado用type参数做参数类型检查,如果类型错误,会抛出一个错误。本例中允许用户使用整数类型的port参数,我们也可以在程序中以options.port形式给出。如果用户没有指定,其默认值为8000。

classIndexHandler(tornado.web.RequestHandler):

   def get(self):

        greeting =self.get_argument('greeting', 'Hello')

       self.write(greeting + ',friendly user!')

这是一个Tornado请求处理类。当处理请求时,Tornado实例化这个类并调用对应的HTTP请求的方法。本例中,我们只定义了一个get方法,意思是这个处理器将回应HTTP GET请求。我们在后在部分会看到更多HTTP方法接口。

greeting =self.get_argument('greeting', 'Hello')

Tornado请求处理器类拥有许多有用的内建方法,其中包括get_argument,在这里用它来从HTTP请求参数中获取greeting参数,而Hello字符串作为默认值。

self.write(greeting + ', friendlyuser!')

Tornado请求处理类另一个方法是write,他获取一个字符串参数并写入到HTTP应答中去。在这里,我们使用请求参数中的greeting参数,并输出到应答中。

if __name__ =="__main__":

   tornado.options.parse_command_line()

   app = tornado.web.Application(handlers=[(r"/", IndexHandler)])

以上几行用于运行Tornado应用程序。首先,我们使用Tornado options库分析命令行。然后创建Application类的实例。传给Application类 __init__方法最重要的参数是handlers。它指出哪个类用来处理哪个请求。

http_server =tornado.httpserver.HTTPServer(app)

http_server.listen(options.port)

tornado.ioloop.IOLoop.instance().start()

以上代码是一个模板式内容,传入一个Application对象给Tornado的HTTPServer对象,它会监听我们在命令行在指出的端口(否则使用默认端口)。最后,我们创建Tornado的IOLoop的实例,之后会指出程序准备好接收HTTP请求。

handlers参数

再看一下hello.py中的这一行:

app =tornado.web.Application(handlers=[(r"/", IndexHandler)])

这个参数很重要,值得仔细进步研究。它必须是一个元组的列表,其中每个元组第一个元素是正则式,第二个元素是一个RequestHandler类。在hello.py中,我们只给出了一对,你可以根据需要给出更多。

用正则指示特殊的地址

Tornado使用正则来匹配HTTP请求地址,它会自动把其中的正则表达包括在开始和结束正则符号中(例如'/'约定为'^/$')

当正则表达式中有捕获组时,组匹配内容会作为参数传给RequestHandler对象中的对应HTTP请求的方法。


 

纯python实现的web: tornado性能测试

C, Erlang, Java, Go 语言的Web Server 性能测试


知乎为什么选择 Tornado 作为 Web 开发框架?

http://www.zhihu.com/question/19574244

在128M的VPS上配置mysql+Tornado+Nginx笔记




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值