tornado原理
- tornado会将客户的socket交给epoll处理
- 当有客户端需要服务时,tornado将IOLoop监听到的信息传给web.Application,通过app的路由来找到对应的handler页面
- 最后handler直接将处理好的信息返回给socket
tornado的一般框架
tornado笔记1和tornado笔记2中的代码都是将所有内容整合到了一起,这样很不利于后期的扩展和开发。我们可以将一个tornado的框架整理至如下的形式:
文件 | 内容 |
---|---|
server.py | 服务器主文件,运行服务器时运行这个文件 里面只有server相关的代码,其他的全靠import |
application.py | 存放了app的路由信息 |
config.py | 用于存放参数options和配置settings |
views文件夹 | 实际存放我们的各种Handler类 目前只有index.py文件,所有的handler类都存放在这个index.py里 |
template文件夹 | 模板文件夹,主要是存放一些html页面,用于向客户端展示 |
upfile文件夹 | 用于存放客户端上传过来的文件 |
static文件夹 | 主要用来存放一些静态文件 |
一个实际的框架展示:
首先是我们的server.py:
import tornado.httpserver
import tornado.ioloop
import tornado.web
from application import Application # 路由
from views import index # 页面
import config # 配置
if __name__=="__main__":
app=Application()
httpServer=tornado.httpserver.HTTPServer(app)
httpServer.bind(config.options["port"])
httpServer.start(1)
tornado.ioloop.IOLoop.current().start()
可以看到首先server会import tornado的三件套(ioloop,web,httpserver)
然后是路由app、页面index及配置文件config
server.py的主体只有创建server的步骤,其他全靠import
然后是application.py:
from views.index import IndexHandler,HomeHandler
import tornado.web
import config
class Application(tornado.web.Application):
def __init__(self):
handlers=[
(r'/',IndexHandler),
(r'/home',HomeHandler)
]
super(Application,self).__init__(handlers,**config.settings)
我们的路由application.py文件需要引入实际的index.py文件来正确地指向这些页面。
页面文件index.py:
from tornado.web import RequestHandler
class IndexHandler(RequestHandler):
def get(self):
self.write("test")
class HomeHandler(RequestHandler):
def get(self):
self.write("test:Home")
index.py中包含了我们所有的页面代码,这里我们有两个页面:IndexHandler和HomeHandler
配置文件config.py:
# 参数
options={
"port":9000
}
# 配置
settings={
"debug":True,
}
这里我们就设置两个东西:
端口号为9000
同时设置为debug模式,在这种模式下对代码的改动可以随时反应到服务器中而不用先叫停服务器、改动代码、再重新运行服务器测试
运行结果:
运行server.py文件,在浏览器里面输入:localhost:9000/ 时,显示的页面:
在浏览器里面输入:localhost:9000/home 时出现的页面: