网络编程
位置:首页>> 网络编程>> Python编程>> Python的Tornado Web框架深入解析

Python的Tornado Web框架深入解析

作者:小小张说故事  发布时间:2021-11-28 03:14:51 

标签: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都是一个值得考虑的选择。

来源:https://segmentfault.com/a/1190000043842556

0
投稿

猜你喜欢

  • 使用css2.1实现多重背景、多重边框效果在单个HTML元素上利用CSS2.1实现拥有3张背景图片和2张内容图效果,或者多重边框的效果。这种
  • 客户端程序编写免不了经常接触XMLHttpRequest对象。微软的XHR实现的progid又是一串一串的。 烦人。抽一个中午时间,找了找资
  • IE 一如既往地带来问题。真的,我觉得 IE 坚持自己的一套无所谓,不支持或者不完全支持标准也无所谓。但是,IE6 IE7 IE8 这三个版
  • 第一种,也是我最常用的,第一帧里加上这个比较灵活,想要自定义加入菜单,只要定义drMenu这个对象就可以了var drMenu&n
  •  我经常需要用Python与solr进行异步请求工作。这里有段代码阻塞在Solr http请求上, 直到第一个完成才会执行第二个请
  • 废话不多说了,直接给大家贴代码了,代码写的不好还去各位大侠见谅。#-*-coding:utf-8-*- #1、字典dict = {'
  • <!--这是一个主页文件--><html><head><meta http-equiv="
  • 下面通过对比来看看ASP中3种分页显示的性能,执行效率。一,使用存储过程分页,这种情况又分为两种方式:第一种,使用command对象,如下:
  • 本文实例讲述了Python读取一个目录下所有目录和文件的方法。分享给大家供大家参考,具体如下:这里介绍的是刚学python时的一个读取目录的
  • 往列表头部和尾部添加元素往头部添加元素list.insert(index,new_element)@@@index为新元素的插入位置,当in
  • 每个人都可以编写CSS代码,甚至你现在已经让它为你的项目工作了。但是CSS还可以更好吗?开始用这5个Tips改进你的CSS吧!一、关于CSS
  • 如果你从未为MySQL设置根用户密码,服务器在以根用户身份进行连接时不需要密码。但是,建议你为每个账户设置密码。如果你以前设置了根用户密码,
  • 本文实例讲述了php延迟静态绑定的方法。分享给大家供大家参考。具体分析如下:php延迟静态绑定:指类的self,不是以定义时为准,而是以计算
  • 安装Python环境ANACONDA是一个Python的发行版本,包含了400多个Python最常用的库,其中就包括了数据分析中需要经常使用
  • 昨天有人在群里问图1的边框效果是否能实现。 边框效果图有人给出答案,需要嵌套一个元素实现。我当时粗粗写了个测试页面,但是时间太晚了,也没有细
  • XML是一项热门的技术。它之所以能够引起人们的兴趣,一个主要的原因在于它十分的简单,人们可以很容易地理解和使用它。每一个程序员都能轻易地看懂
  • 问题你需要将一个Python对象序列化为一个字节流,以便将它保存到一个文件、存储到数据库或者通过网络传输它。解决方案对于序列化最普遍的做法就
  • tensorboard常用于更直观的观察数据在神经网络中的变化,或者用于观测已经构建完成的神经网络的结构。其有助于我们更加方便的去观测ten
  • 空间关系变化始于相遇,所以交点是一切的核心。相交判定首先考察一束光线能否打在某个平面镜上。光线被抽象成了一个列表[a,b,c],平面镜则被抽
  • 当我们写用例断言时,往往一个断言结果是不够的,所以需要加入多重断言,而多重断言,当断言中间出现断言结果False时,会中断后续的断言执行,会
手机版 网络编程 asp之家 www.aspxhome.com