您的位置:首页 > 其它

Tornado 学习小结

2017-10-28 21:41 190 查看
这周熟悉了下tornado。照例,需要总结一下,只是我粗浅的理解。

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

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

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

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

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

一、快速入门

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

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

from tornado.options import define, options
define("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, friendl
4000
y user!

是吧,多么有意思!

main里面的:

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

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

tornado.web.Applicationtornado的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.path

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

from tornado.options import define, options
define("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是开源的,性能这么优秀,今后有机会会看看源码,加深对网络的理解。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: