注意:我是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设置中缺少什么?
由于
答案 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),
])