文档章节

python模块介绍-Tornado:Tornado中文文档-概述

python测试开发人工智能安全
 python测试开发人工智能安全
发布于 2015/06/07 08:54
字数 1816
阅读 6237
收藏 15

快速链接

快速入门

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world\n")

application = tornado.web.Application([(r"/", MainHandler),])

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

用浏览器或者curl等访问http://localhost:8888/,会返回"Hello, world"。

# 服务器端执行
$ python test.py 
WARNING:tornado.access:404 GET /favicon.ico (127.0.0.1) 0.81ms
WARNING:tornado.access:404 GET /favicon.ico (127.0.0.1) 0.81ms
# 客户端执行
$ curl  
Hello, world

这个例子没有用到Tornado的异步功能,异步的实例参见chatdemo.py

Introduction-to-Tornado中介绍的实例稍微复杂点:

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define, options
define("port", default=8888, help="run on the given port", type=int)
class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        greeting = self.get_argument('greeting', 'Hello')
        self.write(greeting + ', friendly user!')
if __name__ == "__main__":
    tornado.options.parse_command_line()
    app = tornado.web.Application(handlers=[(r"/", IndexHandler)])
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

执行结果:

# 服务器端执行
$ python hello.py --port=8000
[I 150525 08:41:53 web:1825] 200 GET / (127.0.0.1) 0.85ms
[I 150525 08:42:26 web:1825] 200 GET /?greeting=Salutations (127.0.0.1) 0.68ms
# 客户端执行
$ curl http://localhost:8000/
Hello, friendly user!
$ curl http://localhost:8000/?greeting=Salutations
Salutations, friendly user!

这里增加了tornado.options.parse_command_line()用于解析http参数。上例中用application.listen(8888)直接启动http服务,这里改为用tornado.httpserver.HTTPServer启动。

Introduction-to-Tornado中字符串实例如下:

import textwrap

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
            
from tornado.options import define, options
define("port", default=8888, help="run on the given port", type=int)

    class ReverseHandler(tornado.web.RequestHandler):
    def get(self, input):
        self.write(input[::-1] + '\n')class WrapHandler(tornado.web.RequestHandler):
    def post(self):
        text = self.get_argument('text')
        width = self.get_argument('width', 40)
        self.write(textwrap.fill(text, int(width)) + '\n')

if __name__ == "__main__":
    tornado.options.parse_command_line()
    app = tornado.web.Application(handlers=[
        (r"/reverse/(\w+)", ReverseHandler),
        (r"/wrap", WrapHandler)
    ])
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

执行结果:

# 服务器端执行
$ python string_service.py --port=8000
[I 150525 09:01:18 web:1825] 200 GET /reverse/stressed (127.0.0.1) 0.56ms
[I 150525 09:01:24 web:1825] 200 GET /reverse/slipup (127.0.0.1) 0.65ms
[I 150525 09:01:59 web:1825] 200 POST /wrap (127.0.0.1) 1.89ms
[I 150525 09:02:14 web:1825] 200 POST /wrap (127.0.0.1) 0.97ms

# 客户端执行
$ curl http://localhost:8000/reverse/stressed
desserts
$ curl http://localhost:8000/reverse/slipup
pupils
$ curl http://localhost:8000/wrap -d text=Lorem+ipsum+dolor+sit+amet,+consectetuer+adipiscing+elit.Lorem ipsum dolor sit amet, consectetuer
adipiscing elit.
$ curl http://localhost:8000/wrap -d text=hello
hello

在上面的代码中,Application类在"handlers"参数中实例化了两个RequestHandler类对象。

"/reverse/(\w+)"中,正则表达式告诉Tornado匹配任何以字符串/reverse/开始并紧跟着一个或多个字母的路径。括号的含义是 让Tornado保存匹配括号里面表达式的字符串,并将其作为请求方法的一个参数传递给RequestHandler类。“get(self, input):”中有一个额外的参数input。这个参数将包含匹配处理函数正则表达式第一个括号里的字符串, 如果正则表达式中有一系列额外的括号,匹配的字符串将被按照在正则表达式中出现的顺序作为额外的参数传递进来。

WrapHandler类处理匹配路径为/wrap的请求。这个处理函数定义了一个post方法,也就是说它接收HTTP的POST方法的请求。Tornado可以解析URLencoded和multipart结构的POST请求。

常见的读写数据库可以结合post和get实现,比如(非实际可执行的例子):

# matched with (r"/widget/(\d+)", WidgetHandler)class WidgetHandler(tornado.web.RequestHandler):
    def get(self, widget_id):
        widget = retrieve_from_db(widget_id)
        self.write(widget.serialize())

    def post(self, widget_id):
        widget = retrieve_from_db(widget_id)
        widget['foo'] = self.get_argument('foo')
        save_to_db(widget)

HTTP请求(GET、POST、PUT、DELETE、HEAD、OPTIONS)可以非常容易地定义,只需要在RequestHandler类中使用 同名的方法。下面是另一个想象的例子,在这个例子中针对特定frob ID的HEAD请求只根据frob是否存在给出信息,而GET方法返回整个对象:

# matched with (r"/frob/(\d+)", FrobHandler)class FrobHandler(tornado.web.RequestHandler):
    def head(self, frob_id):
        frob = retrieve_from_db(frob_id)
        if frob is not None:
            self.set_status(200)
        else:
            self.set_status(404)

    def get(self, frob_id):
        frob = retrieve_from_db(frob_id)
        self.write(frob.serialize())

使用RequestHandler类的set_status()方法显式地设置HTTP状态码。然而,你需要记住在某些情况下,Tornado会自动地设置HTTP状态码。下面是一个常用情况的纲要:

  • 404 Not Found: Tornado会在HTTP请求的路径无法匹配任何RequestHandler类相对应的模式时返回404(Not Found)响应码。

  • 400 Bad Request: 如果你调用了一个没有默认值的get_argument函数,并且没有发现给定名称的参数,Tornado将自动返回一个400(Bad Request)响应码

  • 405 Method Not Allowed: 如果传入的请求使用了RequestHandler中没有定义的HTTP方法(比如,一个POST请求,但是处理函数中只有定义了get方 法),Tornado将返回一个405(Methos Not Allowed)响应码。

  • 500 Internal Server Error: 当程序遇到任何不能让其退出的错误时,Tornado将返回500(Internal Server Error)响应码。你代码中任何没有捕获的异常也会导致500响应码。

  • 200 OK: 如果响应成功,并且没有其他返回码被设置,Tornado将默认返回一个200(OK)响应码。

错误发生时Tornado将默认向客户端发送一个包含状态码和错误信息的简短片段。 可以在你的RequestHandler重载write_error方法自定义错误信息,比如:

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web

from tornado.options import define, options
define("port", default=8888, help="run on the given port", type=int)

class IndexHandler(tornado.web.RequestHandler):
    def get(self):
        greeting = self.get_argument('greeting', 'Hello')
        self.write(greeting + ', friendly user!')
        
    def write_error(self, status_code, **kwargs):
        self.write("Gosh darnit, user! You caused a {0} error.\n".format(
            status_code))

if __name__ == "__main__":
    tornado.options.parse_command_line()
    app = tornado.web.Application(handlers=[(r"/", IndexHandler)])
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

执行结果:

# 服务器端执行
$ python hello-error.py --port=8000
[W 150525 09:58:29 web:1825] 405 POST / (127.0.0.1) 1.39ms

# 客户端执行
$ curl -d foo=bar http://localhost:8000/
Gosh darnit, user! You caused a 405 error.

安装

自动安装:

# pip install tornado

PyPI中包含Tornado,可以通过pip或easy_install来安装。这种方式没有包含源代码中的demo程序,下载的源码包可以解决该问题。

手动安装:

# wget https://pypi.python.org/packages/source/t/tornado/tornado-4.1.tar.gz
# tar xvzf tornado-4.1.tar.gz
# cd tornado-4.1
# python setup.py build
# sudo python setup.py install

预置条件:Tornado支持Python2.6、2.7、3.2、3.3和3.4。依赖certifi,Python 2还依赖backports.ssl_match_hostname,pip或easy_install自动安装依赖。有些Tornado特性可能依赖以下库:

  • unittest2: 在Python2.6执行test suite需要。

  • concurrent.futures: Tornado推荐的线程池,允许使用ThreadedResolver。Python 2需要,Python3中标准库已经包含该功能。

  • pycurl:tornado.curl_httpclient中选择是否使用。要求用7.18.2或更高版本,建议7.21.1或更高版本。

  • twisted: tornado.platform.twisted类可能用到。

  • pycares: 当线程是不适合时用作非阻塞DNS解析器。

  • Monotime: 增加单调时钟,在时钟调整频繁环境中提高可靠性。在Python 3.3不再需要。

平台:Tornado运行在类unix平台,最佳的性能和扩展性体现在Linux(epoll)和BSD(kqueue)(尽管Mac OS X上源于BSD且支持的kqueue,它的网络性能较差,因此只建议用于开发)。Tornado也可在Windows上运行,但不是官方支持和建议仅供开 发使用。

授权:Tornado是Facebook开源的一部分,基于Apache License 2.0。文档基于Creative Commons 3.0。


参考资料


© 著作权归作者所有

共有 人打赏支持
python测试开发人工智能安全
粉丝 180
博文 75
码字总数 346923
作品 0
邵阳
QA/测试工程师
python tornado 工程范例

临时接个任务,写几个操作数据库视图的接口,很简单,大概就是定义一些api,响应终端的请求,返回相应的数据。 借这个机会写一个比较详细的范例教程。 1.环境 Windows 7 Ultimate 32-bit Ap...

何世友
2011/07/10
0
22
python-成长之路

一系列python方面有价值的参考/跟python有关的东西 http://www.path8.net/tn/archives/6017 Tools PyCharm – 来自JetBrains的强大的IDE Python Tools for Visual Studio Eclipse + pydev Ap......

_Mr_Computer_
2016/07/01
0
0
Python学习路线(针对具备一定编程经验者)

相比C,C++,JAVA等编程语言,Python是易学的。但要想深入地理解Python,并熟练地编写Python风格的Python代码。我想还是有一长段路程要走的。下面即是我的一点经验总结,主要是为了整理自己学习...

Thebreezecomes
06/28
0
0
关于Python的几个过坑指南(MySQL-python、tornado)

最近碰到的Python项目中,需要安装MySQL-python依赖,并且项目使用tornado,以下是记录在其中碰到的坑。 0x01 tornado在render渲染html页面时报错 访问页面时服务器响应500,查看错误日志,提...

日生三金
08/09
0
0
Tornado学习笔记(二)

我一直用python2.x,python2.x内置的字符编码方式是unicode,这就对中文的处理造成了一些困扰,尤其是在用tornado写json接口的时候,如果不做处理,出来的没有中文,都是x4d5f之类的东西。所...

Slaytanic
2015/07/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

play framework 如何支持多数据源

有段时间没有写博客了,但今天又写一篇了,主要是因为这事有一丝自己的思考和动手实践,所以就记录下来了。 现有的问题: play 1.2.4 两台数据库服务器,但是play1.2.4 并不支持同时连接两台...

tuerqidi
13分钟前
0
0
Mysql only_full_group_by解析

查看当前数据库模式: select @@sql_mode; 原因: mysql 5.7中的sql_mode的值中包含'ONLY_FULL_GROUP_BY'; 处理:执行以下SQL set GLOBAL sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,N......

bug_404
14分钟前
0
0
防止表单重复提交

1:前端方式(治标不治本) $("#admin-role-save").click(function(){//admin-role-save为submit的idvar ts=$(this);var ts_old_val=ts.val();ts.val("提交中....");ts.att...

uug
14分钟前
0
0
保持屏幕常亮

getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 在act的created方法中调用即可,一般是播放视频的时候......

Carbenson
14分钟前
0
0
智能合约实施指南

与区块链技术一样,智能合约在商业领域也非常有价值。 为了让我们的读者彻底了解智能合约是什么以及它们如何影响现代商业的交易方式,我们准备了本指南。 集中商业模式正在给去中心化的模式让...

geek12345
17分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部