共计 2381 个字符,预计需要花费 6 分钟才能阅读完成。
一、Tornado 简介
Tornado 是一个应用 Python 编写的高效、非阻塞的 web 服务器软件和网络库。它被设计用于解决数以千计的并发连贯,这是因为其非阻塞的 I / O 解决形式。Tornado 最后是由 FriendFeed 开发的,这是一个社交聚合服务,起初被 Facebook 收买。Tornado 通常被用于实时 Web 服务,须要解决大量长连贯的状况。
二、装置和 Hello World 示例
首先,咱们须要在 Python 环境中装置 Tornado。在命令行中输出以下指令即可:
pip install tornado
装置实现后,咱们能够编写一个最根本的 Tornado 利用,即 Hello World:
import tornado.ioloop | |
import tornado.web | |
class 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 AsyncHTTPClient | |
from tornado import gen | |
class 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 都是一个值得思考的抉择。