是否可以从请求/Web处理程序的实例而不是类定义创建Tornado应用程序?

2024-06-17 09:29:32 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

什么样的模式可以绕过龙卷风的这个缺点


Tags: 实例webapp消息定义adminapplication可能性
2条回答

将此作为答案发布,以便从正确的代码格式中获益。
我用于跟踪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模块中的类),因为这些引用只跟踪活动的实例,而这些实例与创建和销毁请求处理程序实例的方式不兼容

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

后者希望生活在一个管理状态的类中:但由于这种设计,我不得不显著地重新划定边界。相反,有必要将所有内容都推到全局变量。很少有人会说这是一种更受欢迎的设计。我一有时间就把tornado扔了

不确定会有什么替代方案:我已经从cherrypy恢复了,因为它本身有很大的局限性:下面是我关于它的几个问题

我带着一些伤疤通过了,但仍然完好无损。还有其他一些问题让我大吃一惊:url's没有得到服务,打鼹鼠的行动也没有明确的结束。它通常也没有得到太多的关注,并且有令人困惑的过时或不完整的文档。这里有大量的文档,这就是为什么我开始写它的原因:但是这些漏洞会造成一系列追逐兔子的情节

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

相关问题 更多 >