乐趣区

关于python:深入理解Python的Tornado-Web框架

一、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 都是一个值得思考的抉择。

退出移动版