使用Tornado运行HTTP服务器时,使用Ember生成的内容无法刷新页面

时间:2017-08-19 16:16:34

标签: ember.js tornado

注意:我是Tornado的新手。

要重新创建我的问题,我有以下Python文件:

import tornado.httpserver
import tornado.ioloop
import tornado.web

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

def start_server():
    app = tornado.web.Application([
        (r'/', IndexHandler),
        (r'/assets/(.*)', tornado.web.StaticFileHandler, {"path": "dist/assets"}),
    ])

    ioLoopInstance = tornado.ioloop.IOLoop.instance()

    http_server = tornado.httpserver.HTTPServer(app, io_loop=ioLoopInstance)
    http_server.listen(34567)
    ioLoopInstance.start()

if __name__ == '__main__':
    start_server()

然后我有一个Ember项目,它有两个路由(/ route1和/ route2),每个路由只有一个按钮,它们只是转换到另一个路径,一个应用程序路由转换到beforeModel中的route1。我将Ember生成的dist目录复制到包含上述Python文件的目录中。当我运行Python文件并导航到localhost:34567时,这会自动转换为localhost:34567 / route1,然后我可以按下按钮在页面之间导航。但是,当我刷新页面或在地址栏中输入localhost:34567 / route1时,我得到一个“404:Not Found”页面。我的Tornado设置中缺少什么?

由于

1 个答案:

答案 0 :(得分:1)

Ember(作为其大多数竞争对手)拥有自己的基于客户端的路由器,它使用pushState(或/和哈希路由)。除非你这样做,否则Ember不向后端发出任何请求。

解决方案很简单,在Tornado中使用IndexHandler表示您期望的所有路径。常见的方法是处理所有路径,但处理资产。例如:

# note 1: '.*' match all
# note 2: Tornado router matches paths in the order,
#         so match all should be the last
app = tornado.web.Application([
    (r'/assets/(.*)', tornado.web.StaticFileHandler, {"path": "dist/assets"}),
    (r'/.*', IndexHandler),
])