是否可以从 Request/Web 处理程序实例而不是 class 定义创建 Tornado 应用程序?

Is it possible to create a Tornado application from instances of Request/Web Handlers instead of class definitions?

提供 class 定义而不是实例的明显要求会导致非常困难的问题。我有两个不同的 类,其中一个需要引用另一个

  app = tornado.web.Application([
    (r"/fusion.*", FusionListener),
    (r"/admin.*", AdminListener),
  ])

AdminListener 需要对 FusionListener 的引用,因为有内部项目需要管理。在这里发送消息是一种不可接受的额外复杂性。目前的机制似乎不提供这种可能性。

在Tornado中什么样的模式可以解决这个缺点?

对于我的用例,存在持久状态和内存状态。对于前者,我们有 sparkpostgres 存储库。对于后者,我已经设计并编写了具有实例级数据结构的应用程序。但我收集到 Tornado launched RequestHandler / WebHandler subclasses 上的实例属性不是持久的。

后者希望生活在 class 管理状态中:但由于这种设计 ot Tornado,我不得不重新划定界限。相反,有必要将所有内容推送到全局变量。很少有人会认为这是首选设计。我一有时间就倾销tornado

不确定替代方案是什么:由于 cherrypy 自身的重大限制,我已经从 cherrypy 恢复:这里有几个我的问题

我通过了那些有一些伤疤但仍然完整的。还有其他问题让我感到震惊:url's 没有得到服务,而且内奸事件没有明确的结束。它通常也没有得到太多关注,并且有令人困惑的过时或不完整的文档。有 大量 的文档 - 这就是我开始使用它的原因:但是这些漏洞导致了一系列追逐兔子的情节。

Flaskdjango 有自己的问题。在 python 中找到一个功能足够但不是超重量级的 Web 服务器似乎是一个虚幻的目标。还不确定哪个框架的问题最少。

将此作为答案发布,以便从正确的代码格式中获益。
我用于跟踪 RequestHandler 的现有实例的范例非常简单:

class MyHandler(RequestHandler):
    _instances = set()

    def get(self):
        if needs_to_be_added(self.request):  # some conditions can be used here
            if len(MyHandler._instances) > THRESHOLD:  # careful with memory usage
                return self.finish("some_error")
            MyHandler._instances.add(self)
        ...

    def post(self):
        if needs_to_be_removed(self.request):
            MyHandler._instances.discard(self)
        ...

当然,您可能需要更改添加/丢弃元素的时间。
根据您将来如何引用现有实例(例如通过某个键),您可以使用 dict 来跟踪它们。

我认为您不能使用弱引用(如 weakref 模块中的 类),因为它们只会跟踪 live 实例这不适用于创建和销毁请求处理程序实例的方式。