Python Tornado呈现静态目录

时间:2014-12-24 00:03:46

标签: python webserver tornado

我正在尝试使用Python中的Tornado API从静态目录提供页面。 This answer is similar to what I am trying to do,但我似乎无法让它发挥作用。

我的目录结构如下所示(所有静态文件都在名为web的文件夹中):

directory file structure

我有一个像这样的网络服务器设置:

class Application(tornado.web.Application):
    def __init__(self):
        handlers = [
            (r'/ws', WSHandler),
            (r'/', IndexHandler),
        ]
        settings = {
            "debug": True,
            "static_path": os.path.join(os.path.dirname(__file__), "web")
        }
        tornado.web.Application.__init__(self, handlers, **settings)

http_server = tornado.httpserver.HTTPServer(Application())
http_server.listen(8888)
tornado.ioloop.IOLoop.instance().start()

我想到了这句话:

"static_path": os.path.join(os.path.dirname(__file__), "web")

可能已经修复了问题,但是当我指向index.html文件时:

class IndexHandler(tornado.web.RequestHandler):
    @tornado.web.asynchronous
    def get(self):
        self.render('web/index.html')

它按预期提供页面,但将此错误消息输出到控制台:

WARNING:tornado.access:404 GET /css/reset.css (::1) 3.57ms
WARNING:tornado.access:404 GET /js/lib/custom-marker.js (::1) 0.96ms
WARNING:tornado.access:404 GET /js/map.js (::1) 2.08ms
WARNING:tornado.access:404 GET /js/websocket-client.js (::1) 1.56ms
WARNING:tornado.access:404 GET /css/index.css (::1) 0.89ms

在这个简约的例子中,我该如何解决我的问题?它在哪里指向并且无法找到文件?

非常感谢您提供的任何帮助!

2 个答案:

答案 0 :(得分:4)

根据Static files and aggressive file caching上的文档部分,在“css”和“js”网址前加上“web”前缀可以解决您的问题。例如:

/css/reset.css应为/web/css/reset.css

或者只是在模板中使用推荐的static_url(如果您正在使用它们):

{{ static_url("css/reset.css") }}

答案 1 :(得分:3)

或者,您可以在静态目录中指定通配符,以便在初始化应用程序时呈现指定目录中的所有文件

app = web.Application([
    (r'/', IndexHandler),
    (r'/js/(.*)', web.StaticFileHandler, {'path': './static/js'}),
    (r'/css/(.*)', web.StaticFileHandler, {'path': './static/css'}),
    (r'/images/(.*)', web.StaticFileHandler, {'path': './static/images'}),

])

上面的代码将相应地映射所有静态URL,

<script src="js/jquery-1.10.1.min.js"></script>

将映射到/static/js dir,

(r'/js/(.*)', web.StaticFileHandler, {'path': './static/js'})

所以,所有的css和图像都是各自的地图制作者,

(r'/css/(.*)', web.StaticFileHandler, {'path': './static/css'}),
(r'/images/(.*)', web.StaticFileHandler, {'path': './static/images'}),