Tornado 学习小结

来源:互联网 发布:淘宝女士春装 编辑:程序博客网 时间:2024/06/14 20:24

这周熟悉了下tornado。照例,需要总结一下,只是我粗浅的理解。

因为学的潦草,而且未学计网,如果写的不对欢迎指正。


简单介绍下tornado: tornado是著名的高性能web服务器框架,它是非阻塞的,速度非常快。


作为一个曾经用C原生socket写了某个小游戏的服务器累瘫还总是出bug后的菜鸡,看到这个,当然是喜,出,望,外!


先推荐一本书:http://demo.pythoner.com/itt2zh/index.html。

这本书是入门小册子,内容易懂,不错的入门书(我还给图书馆荐购了……)


一、快速入门

首先,先来建立一个小demo吧:

import tornado.httpserverimport tornado.ioloopimport tornado.optionsimport tornado.webfrom tornado.options import define, optionsdefine("port", default=8000, 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()
前面四行不解释。 

第七行,定义了端口是8000;help="xxx":如果你在命令行使用了--help选项,就会弹出这句话。

然后定义了一个类IndexHandler,它继承了

tornado.web.RequestHandler
以后可以看到,基本每个tornado应用都继承这个类。

里面重写了get方法。

get_argument('greeting', 'Hello')

get_argument是个重要的函数,它得到的是http方法的参数。第二个是默认参数。

然后

self.write(greeting + ', friendly user!')
是把内容写在网页里面。

如果你在地址栏中写

localhost:8000

屏幕会显示:

Hello,friendly user!

如果你在地址栏中写

localhost:8000/?greeting = 'Hey'

屏幕会显示:

Hey, friendly user!


是吧,多么有意思!


main里面的:

第一句是让命令行能够解释你的那些options设置

第二句是创建了一个tornado的app应用!这是很关键的。

tornado.web.Application
tornado的app都是这个类的实例!里面的参数handlers,记住它是一个列表,存储的是元组,元组第一个存放的是正则表达式,第二个是你自己写的继承tornado.web.RequestHanlder的hanlder然后你的hanlder对应的网页,就能够在正则表达式决定的URL中显示了。如果要建立的APP有多类需要访问的网页,那么可以在handlers列表中添加更多的元组,一个元组对应一类网页。

正则表达式和你网页最后的URL有关。比如例子中的"/",那就是localhost:8000/

如果写"/(\w+)",那就可以访问 localhost:8000/abc

如果写“/(\d+)”,那就可以访问 localhost:8000/1321414525

第三句是创建tornado服务器的实例,然后第四句开始监听,最后一句是事件循环。



二、tornado与模板

一般web开发,都有两个文件夹,一个是static,还有一个是template,前者存放的是网页中一些静态的文件,比如图片,文档,或者是css,后者是网页的模板。

tornado实现模板渲染是render函数实现的,看一个例子:

import os.pathimport tornado.httpserverimport tornado.ioloopimport tornado.optionsimport tornado.webfrom tornado.options import define, optionsdefine("port", default=8000, help="run on the given port", type=int)class IndexHandler(tornado.web.RequestHandler):    def get(self):        self.render('index.html')class PoemPageHandler(tornado.web.RequestHandler):    def post(self):        noun1 = self.get_argument('noun1')        noun2 = self.get_argument('noun2')        verb = self.get_argument('verb')        noun3 = self.get_argument('noun3')        self.render('poem.html', roads=noun1, wood=noun2, made=verb,                difference=noun3)if __name__ == '__main__':    tornado.options.parse_command_line()    app = tornado.web.Application(        handlers=[(r'/', IndexHandler), (r'/poem', PoemPageHandler)],        template_path=os.path.join(os.path.dirname(__file__), "templates")    )    http_server = tornado.httpserver.HTTPServer(app)    http_server.listen(options.port)    tornado.ioloop.IOLoop.instance().start()


先看IndexHandler类,他没有参数,直接写render('index.html'),index.html里面的确没有参数,结果就是直接展示这个html,

注意PoemPageHandler类中,重写了post方法,post里面最后一句:

self.render('poem.html', roads=noun1, wood=noun2, made=verb,                difference=noun3)
这是渲染了poem.html,后面是关键字参数。


下面看下html文件

Index.html

<!DOCTYPE html><html>    <head><title>Poem Maker Pro</title></head>    <body>        <h1>Enter terms below.</h1>        <form method="post" action="/poem">        <p>Plural noun<br><input type="text" name="noun1"></p>        <p>Singular noun<br><input type="text" name="noun2"></p>        <p>Verb (past tense)<br><input type="text" name="verb"></p>        <p>Noun<br><input type="text" name="noun3"></p>        <input type="submit">        </form>    </body></html>

poem.html

<!DOCTYPE html><html>    <head><title>Poem Maker Pro</title></head>    <body>        <h1>Your poem</h1>        <p>Two {{roads}} diverged in a {{wood}}, and I—<br>I took the one less travelled by,<br>And that has {{made}} all the {{difference}}.</p>    </body></html>

在index.html里面有一个表单,意思是给/poem提供数据,post到/poem后,触发了PoemPage类的post方法,post方法接受表单数据,然后拆分,传给了poem.html进行渲染,然后显示它!


这是简单的一个模板例子。模板还能包含语句和块,限于能力不展开了……


三、tornado与Mongodb

服务器当然要和数据库连接啦。mongodb我超,级,喜,欢!感觉非常自由。

python有pymongo与mongodb实现连接,所以可以用pymongo来进行数据库操作。

关于pymongo,推荐这个快速tutorial:http://api.mongodb.com/python/current/tutorial.html

我推荐的那本Introduction to tornado上面关于pymongo建立client的方法过时了,请参考tutorial。


书中讲了个从mongodb中先存一些单词和解释的文档,然后用tornado来建立这些URL然后访问,我觉得非常有意思。具体不多描述了,自己看书第四章。


四、异步

说实话这块没怎么看懂,不好写总结(谁让我这么菜呢



后记:感觉自己需要补充很多计网方面的知识啊,而且tornado是开源的,性能这么优秀,今后有机会会看看源码,加深对网络的理解。



原创粉丝点击