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

Con*_*zio 4 python tornado

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

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

var app = express();
app.use(express.static(__dirname + '/public'));
Run Code Online (Sandbox Code Playgroud)

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

我在SO上看到的解决静态文件服务的所有解决方案(就像这个一样)让它处于"只是前置/静态".

这就是我现在所拥有的:

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()
Run Code Online (Sandbox Code Playgroud)

当我尝试加载index.htmlHTML渲染时,我也收到此错误:

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

Ben*_*ell 7

只需/public/从处理程序表中的路径中删除(但保留它public_root,并所有其余部分之后移动此定义(因为如果你允许它将匹配所有内容):

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

你不需要static_path在你的settings,如果你正在建立自己的StaticFileHandler.