You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python-Tornado:如何将静态文件设为根路径且不屏蔽其他路由?

Tornado配置根路径返回index.html的解决方案

你遇到的问题核心有两个:

  1. 通配符路由/(.*)会拦截所有请求(包括API路由/main),因为Tornado路由是按顺序匹配的,先定义的路由优先生效
  2. 直接用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 00:40:41