主要模块
web- FriendFeed 使用的基础 Web 框架,包含了 Tornado 的大多数重要的功能database- 对MySQLdb的简单封装,使其更容易使用template- 基于 Python 的 web 模板系统httpclient- 非阻塞式 HTTP 客户端,它被设计用来和web及httpserver协同工作auth- 第三方认证的实现(包括 Google OpenID/OAuth、Facebook Platform、Yahoo BBAuth、FriendFeed OpenID/OAuth、Twitter OAuth)
底层模块
httpserver- 服务于web模块的一个非常简单的 HTTP 服务器的实现iostream- 对非阻塞式的 socket 的简单封装,以方便常用读写操作ioloop- 核心的 I/O 循环
从tornado的官方文档中,我们能够知道对于tornado来说最主要的几个模块主要是web、httpclient、httpserver、iostream和ioloop这几个模块。所以现在我们可以按照顺序来庖丁解牛。
Tornado框架设计模型
神奇的Hello World
首先,我们还是从最神奇的Demo中来开始,一步一步来看看,这个程序是怎么来运行的。
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
application = tornado.web.Application([
(r"/", MainHandler),
])
if __name__ == "__main__":
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()
在这个Demo中,最重要的是
叫
Application的这样的一个类,这个类有什么用和是怎么定义的,我们直接看代码。
这个部分是APPlication的初始化。
class
Application
(
object
):
def
__init__
(
self
,
handlers
=
None
,
default_host
=
""
,
transforms
=
None
,
wsgi
=
False
,
**
settings
):
/*********
这些都是一些初始化的操作,可以省略。。。
最主要的是查看调用下面self.add_handlers来处理
handlers = [
[
(r"/", MainHandler),
)]
**********/
self
.
handlers
=
[]
self
.
named_handlers
=
{}
if
handlers
:
self
.
add_handlers
(
".*$"
,
handlers
) #初始化一下根据不用的URL调用不同的
#
RequestHandler类,具体下面有解释
def
listen
(
self
,
port
,
address
=
""
,
**
kwargs
):
# import is here rather than top level because HTTPServer
# is not importable on appengine
from
tornado.httpserver
import
HTTPServer
server
=
HTTPServer
(
self
,
**
kwargs
) #启动的还是tornado默认的内嵌服务
server
.
listen
(
port
,
address
)
ef
add_handlers
(
self
,
host_pattern
,
host_handlers
): #这个函数主要是做个路由功能,
#初始化一下根据不用的URL调用不同函数
if
not
host_pattern
.
endswith
(
"$"
):
host_pattern
+=
"$"
handlers
=
[]
if
self
.
handlers
and
self
.
handlers
[
-
1
][
0
]
.
pattern
==
'.*$'
:
self
.
handlers
.
insert
(
-
1
,
(
re
.
compile
(
host_pattern
),
handlers
))
else
:
self
.
handlers
.
append
((
re
.
compile
(
host_pattern
),
handlers
))
for
spec
in
host_handlers
:
if
isinstance
(
spec
,
(
tuple
,
list
)):
assert
len
(
spec
)
in
(
2
,
3
,
4
)
spec
=
URLSpec
(
*
spec
)
handlers
.
append
(
spec
)
if
spec
.
name
:
if
spec
.
name
in
self
.
named_handlers
:
app_log
.
warning
(
"Multiple handlers named
%s
; replacing previous value"
,
spec
.
name
)
self
.
named_handlers
[
spec
.
name
]
=
spec
#这一部分主要是把传入的handlers传入的一个处理,
#根据debug信息,处理的结果如下:
#
定义Application的时候主要是做一个一些变量的初始化。
第二部分:
Appliction.listen(8888)
这个部分主要是调用
HTTPServer对象进行监听.
直接上源码:
def
listen
(
self
,
port
,
address
=
""
,
**
kwargs
):
# import is here rather than top level because HTTPServer
# is not importable on appengine
from
tornado.httpserver
import
HTTPServer
server
=
HTTPServer
(
self
,
**
kwargs
)
server
.
listen
(
port
,
address
)
ok,这部分初始化完了,主要是根据运行一步一步的抽丝剥茧,下一步的应该是去剖析
HTTPServer这个类对象了。
这是自己第一次写技术Blog,没准有不入大神大婶发眼的,多多指正,欢迎大家多交流。
QQ:625106674
Email: ky150@126.com
809

被折叠的 条评论
为什么被折叠?



