main.py是程序入口css
handlers目录是用来放置路由处理类的地方,为了能让外部可以使用里面的东西,就把它作成了一个包,里面包含了一个空的__init__文件html
static目录是用来放js,css之类的静态文件的python
templates是用来放置html模板的地方web
#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"app
r"/home" 路径的请求如今被HomeHandler来处里,这个类会在后面介绍tornado
r".*"路径被用来当作404的处理, 这个必须放在最后, tornado对于路径的匹配顺序是按照handlers数组顺序进行匹配的oop
若是你把handlers的顺序改为下面这个样子,就会发现任何路径都是404了,由于只要发现第一个匹配的就马上进行处理url
handlers = [ (r".*", PageNotFoundHandler), (r"/", tornado.web.RedirectHandler, {"url": "/home"}), (r"/home", HomeHandler), ]
settings 里面有两个设置spa
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正确返回了.