tornado總結2-靜態文件設置

代碼結構

main.py是程序入口css

handlers目錄是用來放置路由處理類的地方,爲了能讓外部可以使用裏面的東西,就把它作成了一個包,裏面包含了一個空的__init__文件html

static目錄是用來放js,css之類的靜態文件的python

templates是用來放置html模板的地方web


main.py說明

#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說明

#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的模板還有不少其餘的功能,下篇再講.


其餘文件說明

home.html

<!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>


home.js

window.onload = function () {
    alert("頁面載入彈窗");
}


實際運行效果

頁面載入時出現js設置的彈窗

這說明html裏面的

<script src="/static/js/home.js"></script>

被tornado正確返回了.

相關文章
相關標籤/搜索