天天看点

python web ui框架_Python开发【第十五篇】:Web框架之Tornado

概述

Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本。这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了能有效利用非阻塞式服务器环境,这个 Web 框架还包含了一些相关的有用工具 和优化。

Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,这意味着对于实时 Web 服务来说,Tornado 是一个理想的 Web 框架。我们开发这个 Web 服务器的主要目的就是为了处理 FriendFeed 的实时功能 ——在 FriendFeed 的应用里每一个活动用户都会保持着一个服务器连接。(关于如何扩容 服务器,以处理数以千计的客户端的连接的问题,请参阅 C10K problem。)

下载安装:

pip3 install tornado

源码安装

https://pypi.python.org/packages/source/t/tornado/tornado-4.3.tar.gz

框架使用

一、快速上手

#!/usr/bin/env python

# -*- coding:utf-8 -*-

import tornado.ioloop

import tornado.web

class MainHandler(tornado.web.RequestHandler):

def get(self):

self.write("Hello, world")

application = tornado.web.Application([

(r"/index", MainHandler),

])

if __name__ == "__main__":

application.listen(8888)

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

执行过程:

第一步:执行脚本,监听 8888 端口

第二步:浏览器客户端访问 /index  -->  http://127.0.0.1:8888/index

第三步:服务器接受请求,并交由对应的类处理该请求

第四步:类接受到请求之后,根据请求方式(post / get / delete ...)的不同调用并执行相应的方法

第五步:方法返回值的字符串内容发送浏览器

python web ui框架_Python开发【第十五篇】:Web框架之Tornado
python web ui框架_Python开发【第十五篇】:Web框架之Tornado

#!/usr/bin/env python#-*- coding:utf-8 -*-#!/usr/bin/env python#-*- coding:utf-8 -*-

importtornado.ioloopimporttornado.webfrom tornado importhttpclientfrom tornado.web importasynchronousfrom tornado importgenimportuimodules as mdimportuimethods as mtclassMainHandler(tornado.web.RequestHandler):

@asynchronous

@gen.coroutinedefget(self):print 'start get'http=httpclient.AsyncHTTPClient()

http.fetch("http://127.0.0.1:8008/post/", self.callback)

self.write('end')defcallback(self, response):printresponse.body

settings={'template_path': 'template','static_path': 'static','static_url_prefix': '/static/','ui_methods': mt,'ui_modules': md,

}

application=tornado.web.Application([

(r"/index", MainHandler),

],**settings)if __name__ == "__main__":

application.listen(8009)

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

异步非阻塞示例

二、路由系统

路由系统其实就是 url 和 类 的对应关系,这里不同于其他框架,其他很多框架均是 url 对应 函数,Tornado中每个url对应的是一个类。

#!/usr/bin/env python

# -*- coding:utf-8 -*-

import tornado.ioloop

import tornado.web

class MainHandler(tornado.web.RequestHandler):

def get(self):

self.write("Hello, world")

class StoryHandler(tornado.web.RequestHandler):

def get(self, story_id):

self.write("You requested the story " + story_id)

class BuyHandler(tornado.web.RequestHandler):

def get(self):

self.write("buy.wupeiqi.com/index")

application = tornado.web.Application([

(r"/index", MainHandler),

(r"/story/([0-9]+)", StoryHandler),

])

application.add_handlers('buy.wupeiqi.com$', [

(r'/index',BuyHandler),

])

if __name__ == "__main__":

application.listen(80)

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

Tornado中原生支持二级域名的路由,如:

python web ui框架_Python开发【第十五篇】:Web框架之Tornado

三、模板引擎

Tornao中的模板语言和django中类似,模板引擎将模板文件载入内存,然后将数据嵌入其中,最终获取到一个完整的字符串,再将字符串返回给请求者。

Tornado 的模板支持“控制语句”和“表达语句”,控制语句是使用 {% 和 %} 包起来的 例如 {% if len(items) > 2 %}。表达语句是使用 {{ 和 }} 包起来的,例如 {{ items[0] }}。

控制语句和对应的 Python 语句的格式基本完全相同。我们支持 if、for、while 和 try,这些语句逻辑结束的位置需要用 {% end %} 做标记。还通过 extends 和 block 语句实现了模板继承。这些在 template 模块 的代码文档中有着详细的描述。

注:在使用模板前需要在setting中设置模板路径:"template_path" : "tpl"

1、基本使用

python web ui框架_Python开发【第十五篇】:Web框架之Tornado
python web ui框架_Python开发【第十五篇】:Web框架之Tornado

#!/usr/bin/env python#-*- coding:utf-8 -*-

importtornado.ioloopimporttornado.webclassMainHandler(tornado.web.RequestHandler):defget(self):

self.render("index.html", list_info = [11,22,33])

application=tornado.web.Application([

(r"/index", MainHandler),

])if __name__ == "__main__":

application.listen(8888)

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

app.py

python web ui框架_Python开发【第十五篇】:Web框架之Tornado
python web ui框架_Python开发【第十五篇】:Web框架之Tornado

老男孩

  • {% for item in list_info %}
  • {{item}}{% end %}

index.html

python web ui框架_Python开发【第十五篇】:Web框架之Tornado
python web ui框架_Python开发【第十五篇】:Web框架之Tornado

在模板中默认提供了一些函数、字段、类以供模板使用:

escape: tornado.escape.xhtml_escape 的別名

xhtml_escape: tornado.escape.xhtml_escape 的別名

url_escape: tornado.escape.url_escape 的別名

json_encode: tornado.escape.json_encode 的別名

squeeze: tornado.escape.squeeze 的別名

linkify: tornado.escape.linkify 的別名

datetime: Python 的 datetime 模组

handler: 当前的 RequestHandler 对象

request: handler.request 的別名

current_user: handler.current_user 的別名

locale: handler.locale 的別名

_: handler.locale.translate 的別名

static_url:forhandler.static_url 的別名

xsrf_form_html: handler.xsrf_form_html 的別名

其他方法

2、母版

python web ui框架_Python开发【第十五篇】:Web框架之Tornado
python web ui框架_Python开发【第十五篇】:Web框架之Tornado

老男孩

{% block CSS %}{% end %}

{% block RenderBody %}{% end %}