一、Tornado简介
Tornado是一个应用Python编写的高效、非阻塞的web服务器软件和网络库。它被设计用于解决数以千计的并发连贯,这是因为其非阻塞的I/O解决形式。Tornado最后是由FriendFeed开发的,这是一个社交聚合服务,起初被Facebook收买。Tornado通常被用于实时Web服务,须要解决大量长连贯的状况。
二、装置和Hello World示例
首先,咱们须要在Python环境中装置Tornado。在命令行中输出以下指令即可:
pip install tornado
装置实现后,咱们能够编写一个最根本的Tornado利用,即Hello World:
import tornado.ioloopimport tornado.webclass MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world")def make_app(): return tornado.web.Application([ (r"/", MainHandler), ])if __name__ == "__main__": app = make_app() app.listen(8888) tornado.ioloop.IOLoop.current().start()
上述代码定义了一个简略的HTTP服务器,对于根URL("/")的GET申请,返回"Hello, world"。而后,咱们在本地的8888端口上启动了这个服务器。
三、路由和申请解决
在Tornado中,每个HTTP申请都由一个RequestHandler
子类进行解决。这个子类须要定义一个对应于HTTP办法(如GET或POST)的办法。在上述的Hello World示例中,咱们定义了一个get()
办法来响应GET申请。
每个RequestHandler
子类都关联一个URL模式,这个模式由Application
的路由配置决定。例如,以下代码将URL模式"/user"关联到了UserHandler
:
def make_app(): return tornado.web.Application([ (r"/user", UserHandler), ])
这意味着,对于URL"/user"的申请,将由UserHandler
进行解决。
四、模板和UI
Tornado蕴含一个弱小的模板语言,使得生成动静HTML变得简略。在Tornado模板中,咱们能够应用Python表达式,也能够应用控制流语句如for循环和if条件。
以下是一个Tornado模板的例子:
<html> <head> <title>{{ title }}</title> </head> <body> <ul> {% for item in items %} <li>{{ escape(item) }}</li> {% end %} </ul> </body></html>
在这个模板中,{{ title }}
和{{ escape(item) }}
是Python表达式,它们将被相应的值替换。{% for item in items %}
和{% end %}
则形成了一个for循环,用于生成一个列表。
五、异步和非阻塞I/O
Tornado的一个重要特点是其反对异步和非阻塞I/O。这使得Tornado能够在单个线程中解决数千个并发连贯,从而无效地解决高负载的实时Web服务。
在Tornado中,咱们能够应用@tornado.gen.coroutine
装璜器和yield
关键字编写异步操作,使得这些操作看起来像同步操作一样。例如,以下代码应用了Tornado的AsyncHTTPClient
进行异步HTTP申请:
from tornado.httpclient import AsyncHTTPClientfrom tornado import genclass MainHandler(tornado.web.RequestHandler): @gen.coroutine def get(self): http_client = AsyncHTTPClient() response = yield http_client.fetch("http://example.com") self.write(response.body)
上述代码中,http_client.fetch()
是一个异步操作,它将立刻返回一个Future
对象。yield
关键字将暂停以后的协程,直到这个Future
对象实现。在Future
实现后,yield
表达式的值将是Future
的后果,即HTTP响应。
六、WebSockets和实时服务
Tornado反对WebSockets,这是一个在单个TCP连贯上提供全双工通信的协定。这使得Tornado能够很好地反对实时Web服务。
在Tornado中,咱们能够通过继承WebSocketHandler
类并重写其办法来实现一个WebSocket服务。例如,以下代码实现了一个简略的回显WebSocket服务:
class EchoWebSocket(tornado.websocket.WebSocketHandler): def open(self): print("WebSocket opened") def on_message(self, message): self.write_message("You said: " + message) def on_close(self): print("WebSocket closed")
七、论断
Tornado是一个弱小的Web框架和网络库,它反对异步和非阻塞I/O,反对WebSockets,蕴含一个模板语言,并提供了对许多HTTP性能的低级别拜访。无论您是在构建一个实时Web服务,还是在寻找一个能解决高负载的Web框架,Tornado都是一个值得思考的抉择。