main.py是程序入口
handlers目录是用来放置路由处理类的地方,为了能让外部能够使用里面的东西,就把它做成了一个包,里面包含了一个空的__init__文件
static目录是用来放js,css之类的静态文件的
templates是用来放置html模板的地方
#main.py
import os
import tornado.httpserver
import tornado.ioloop
import tornado.web
from handlers.home import HomeHandler
class PageNotFoundHandler(tornado.web.RequestHandler):
def get(self):
return self.write_error(404)
class Application(tornado.web.Application):
def __init__(self):
handlers = [
(r"/", tornado.web.RedirectHandler, {"url": "/home"}),
(r"/home", HomeHandler),
(r".*", PageNotFoundHandler),
]
settings = dict(
static_path= os.path.join(os.path.dirname(__file__), "static"),
template_path=os.path.join(os.path.dirname(__file__), "templates"),
)
tornado.web.Application.__init__(self, handlers, **settings)
if __name__ == "__main__":
port = 8899
application = Application()
http_server = tornado.httpserver.HTTPServer(application, xheaders=True)
http_server.listen(port)
print('Listen on http://localhost:{0}'.format(port))
tornado.ioloop.IOLoop.instance().start()
handlers 里面设置了三个路径
r"/" 被重定向到了 "/home"
r"/home" 路径的请求现在被HomeHandler来处里,这个类会在后面介绍
r".*"路径被用来当做404的处理, 这个必须放在最后, tornado对于路径的匹配顺序是按照handlers数组顺序进行匹配的
如果你把handlers的顺序改成下面这个样子,就会发现任何路径都是404了,因为只要发现第一个匹配的就立刻进行处理
handlers = [
(r".*", PageNotFoundHandler),
(r"/", tornado.web.RedirectHandler, {"url": "/home"}),
(r"/home", HomeHandler),
]
settings 里面有两个设置
static_path是用来设置静态文件地址的, tornado内部监视了路径r"/static/*"的所有请求,而这个设置是用来将这个路径下面的所有请求,直接返回本地文件的,直接看tornado.web.py的源代码就明白了.
以下是tornado.web.py中关于static_path设置的处理流程
#tornado web.py
#...
if self.settings.get("static_path"):
path = self.settings["static_path"]
handlers = list(handlers or [])
static_url_prefix = settings.get("static_url_prefix",
"/static/")
static_handler_class = settings.get("static_handler_class",
StaticFileHandler)
static_handler_args = settings.get("static_handler_args", {})
static_handler_args['path'] = path
for pattern in [re.escape(static_url_prefix) + r"(.*)",
r"/(favicon\.ico)", r"/(robots\.txt)"]:
handlers.insert(0, (pattern, static_handler_class,
static_handler_args))
直接将"/static/"映射为本地文件目录, 因此在html里面使用js和css时一般建议的格式是以"/static/"开头
<script src="/static/js/home.js"></script>
template_path是用来放置html模板文件的地方, 提供给 tornado.web.RequestHandler的render方法来查找模板文件用的.
#home.py
import tornado.web
class HomeHandler(tornado.web.RequestHandler):
def get(self):
return self.render('home.html')
对于收到的get请求,直接使用render返回"home.html", 而"home.html"的查找根目录是在前面的template_path设置的.
tornado的模板还有很多其他的功能,下篇再讲.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>主页</title>
</head>
<body>
<h1 id="home_head">这是主页</h1>
<script src="/static/js/home.js"></script>
</body>
</html>
window.onload = function () {
alert("页面载入弹窗");
}
页面载入时出现js设置的弹窗
这说明html里面的
<script src="/static/js/home.js"></script>
被tornado正确返回了.