Python-Tornado:如何将静态文件设为根路径且不屏蔽其他路由?
Tornado配置根路径返回index.html的解决方案
你遇到的问题核心有两个:
- 通配符路由
/(.*)会拦截所有请求(包括API路由/main),因为Tornado路由是按顺序匹配的,先定义的路由优先生效 - 直接用
r"/"绑定StaticFileHandler会报错,因为StaticFileHandler的get()方法需要捕获path参数,而r"/"没有提供该参数
下面给出两种可行的解决方案:
方案一:调整路由顺序(推荐)
将API路由放在静态路由前面,确保API请求优先被匹配,同时保留通配符静态路由处理根路径和其他静态文件请求。
修改make_app()函数如下:
def make_app(): return tornado.web.Application([ (r"/main", MainHandler), # API路由优先匹配 (r"/(.*)", tornado.web.StaticFileHandler, {'path': static_path, 'default_filename':'index.html'}), ])
效果说明:
- 访问
/时,匹配/(.*),path为空字符串,StaticFileHandler会自动返回default_filename指定的index.html - 访问
/main时,优先匹配第一个路由,返回"Hello, world" - 访问
/test.js时,匹配/(.*),返回static/test.js文件
方案二:拆分路由,单独处理根路径
如果不想让静态路由匹配所有路径,可以单独写一个根路径Handler,同时将静态文件挂载到/static路径下。
步骤1:添加根路径Handler
在test_app.py中新增一个Handler:
class RootHandler(tornado.web.RequestHandler): def get(self): # 读取并返回index.html内容 with open(os.path.join(static_path, 'index.html'), 'r', encoding='utf-8') as f: self.write(f.read()) self.set_header('Content-Type', 'text/html')
步骤2:修改路由配置
更新make_app()函数:
def make_app(): return tornado.web.Application([ (r"/", RootHandler), (r"/main", MainHandler), (r"/static/(.*)", tornado.web.StaticFileHandler, {'path': static_path}), ])
效果说明:
- 访问
/时,RootHandler直接返回index.html - 访问
/main走API路由 - 静态文件需要通过
/static/test.js的形式访问
额外修复:移除冗余代码
你原代码的if __name__ == "__main__"块中有一行多余的await asyncio.Event().wait(),会导致报错,需要删除,修改后如下:
if __name__ == "__main__": print("starting asyncio main loop") asyncio.run(main())
内容的提问来源于stack exchange,提问作者Brian McFarland
相关产品推荐
相关产品推荐

