tornado总结2-静态文件设置

代码结构

tornado总结2-静态文件设置_第1张图片

main.py是程序入口

handlers目录是用来放置路由处理类的地方,为了能让外部能够使用里面的东西,就把它做成了一个包,里面包含了一个空的__init__文件

static目录是用来放js,css之类的静态文件的

templates是用来放置html模板的地方


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"

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说明

#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("页面载入弹窗");
}


实际运行效果

tornado总结2-静态文件设置_第2张图片

页面载入时出现js设置的弹窗

这说明html里面的

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

被tornado正确返回了.




你可能感兴趣的:(tornado总结2-静态文件设置)