让Tornado使用javascript提供静态HTML,而不使用静态,公共等前缀

时间:2015-02-03 17:09:05

标签: python tornado

有没有办法避免在我的HTML文件中为每个javascript src属性预先添加" public"," static"等?我正在将基本的静态服务器从Node.js转换为Tornado,除此之外一切都很顺利。

我想要模拟的等效Node.js / Express代码如下:

var app = express();
app.use(express.static(__dirname + '/public'));

有效地更改了所有内容的服务目录。这样我可以做<script src="js/foo.js">而不是<script src="public/js/foo.js">

我在SO上看到的解决静态文件服务的所有解决方案(如this one)都将其留在了,#34;只是前置/静态&#34;。

这就是我现在所拥有的:

import os
import tornado.ioloop
import tornado.web as web

public_root = os.path.join(os.path.dirname(__file__), 'public')

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.render('index.html')


handlers = [
  (r'/public/(.*)', web.StaticFileHandler, {'path': public_root}),
  (r'/', MainHandler)
]

settings = dict(
  debug=True,
  static_path=public_root,
  template_path=public_root
)

application = web.Application(handlers, **settings)

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

当我尝试加载index.html时HTML呈现正常,但我也收到此错误:

WARNING:tornado.access:404 GET /bower_components/d3/d3.min.js (::1) 0.55ms

1 个答案:

答案 0 :(得分:7)

只需从处理程序表中的路径中删除/public/(但将其保留在public_root中,然后在之后移动此定义(因为它将匹配所有内容你放了):

handlers = [
  (r'/', MainHandler),
  (r'/(.*)', web.StaticFileHandler, {'path': public_root}),
]

如果您要设置自己的static_path,则settings中不需要StaticFileHandler