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正確返回了.