回到在 Tornado 中提供静态内容

Falling back to serving static content in Tornado

我正在使用龙卷风并且我有这样的设置:

application = tornado.web.Application([
    (r"/", MainHandler),
    (r"/wiki/(.+)", WikiHandler),
    (r"/static/(.*)", tornado.web.StaticFileHandler, {"path": "./static/"})
], template_path = 'templates')

我现在要解决的问题是在某些情况下将 select 查询从 /wiki/ 转发到静态处理程序。现在,处理程序如下所示:

def get(self, path):
    passthroughName = os.path.join ('content', path)
    if os.path.exists (passthroughName):
        self.write (open (passthroughName, 'rb').read ())
        self.finish ()
        return
    else:
        # Do some stuff

我想做的是有一个 StaticFileHandler,它首先为 /wiki/ 中的路径调用,如果它失败,则请求被转发到我的处理程序。有没有一些简单的配置方法可以做到这一点,还是我必须继承 StaticFileHandler 并手动处理其中的 404?

目前不可能让一个处理程序无缝地委托给另一个处理程序,并且 StaticFileHandler 尤其难以以这种方式集成,因为它假定 URLs 和 Etag 之间的静态映射(如果文件在服务器 运行 时可以修改磁盘上的内容,您可能不需要 StaticFileHandler!)。我的第一个建议是设计 URL space 以便您可以通过 URL 上的正则表达式区分静态和动态部分。

如果您不能这样做,最好扩展您当前使用的处理程序以从 StaticFileHandler 添加您需要的功能,而不是尝试组装结合两个单独处理程序的东西。