我正在尝试使用Python中的Tornado API从静态目录中提供页面。 This answer is similar to what I am trying to do,但我似乎无法让它工作。
我的目录结构如下所示(所有静态文件都在名为web
的文件夹中):
我有一个像这样的网络服务器设置:
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
在这个简约的例子中,我该如何解决我的问题?它在哪里指向并且无法找到文件?
您将提供的任何帮助将不胜感激!
根据Static files and aggressive file caching的文档部分,在“css”和“js”网址前加上“web”前缀可以解决您的问题。例如:
/css/reset.css
应该是/web/css/reset.css
或者只是在模板中使用推荐的static_url
(如果你正在使用它们):
{{ static_url("css/reset.css") }}
或者,您可以在静态目录中指定通配符,以便在初始化应用程序时呈现指定目录中的所有文件
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
目录,
(r'/js/(.*)', web.StaticFileHandler, {'path': './static/js'})
所以,所有的css和图像都是各自的映射器,
(r'/css/(.*)', web.StaticFileHandler, {'path': './static/css'}),
(r'/images/(.*)', web.StaticFileHandler, {'path': './static/images'}),