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是个重要的函数,它得到的是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是开源的,性能这么优秀,今后有机会会看看源码,加深对网络的理解。
因为学的潦草,而且未学计网,如果写的不对欢迎指正。
简单介绍下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是开源的,性能这么优秀,今后有机会会看看源码,加深对网络的理解。
相关文章推荐
- 软件需求学习小结
- 网络编程学习小结
- clone的fork与pthread_create创建线程有何不同&pthread多线程编程的学习小结
- Unity学习小结5 - 利用BMFont制作美术字及要点注意
- dwr学习小结
- STL学习小结
- Linux Shell学习简单小结(更新中……)
- Android学习小结(三)——自定义圆角ImageView控件
- 学习小结
- treap学习小结(一)
- 【Linux学习笔记】获取文件属性 — stat()、fstat()、lstat()小结
- 中文自动分词学习小结
- Tornado 学习笔记
- 研读《基于Hadoop的海量业务数据分析平台的设计与实现》----flume一章学习小结
- Android开发之Menu(菜单功能)学习小结
- shell学习小总结----本章小结
- tornado 学习笔记15 _ServerRequestAdapter分析
- JDBC学习小结
- C# 静态成员和方法的学习小结
- Maven学习(十) - 阶段小结