是否可以从 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中什么样的模式可以解决这个缺点?
对于我的用例,存在持久状态和内存状态。对于前者,我们有 spark
和 postgres
存储库。对于后者,我已经设计并编写了具有实例级数据结构的应用程序。但我收集到 Tornado
launched RequestHandler
/ WebHandler
subclasses 上的实例属性不是持久的。
后者希望生活在 class 管理状态中:但由于这种设计 ot Tornado
,我不得不重新划定界限。相反,有必要将所有内容推送到全局变量。很少有人会认为这是首选设计。我一有时间就倾销tornado
。
不确定替代方案是什么:由于 cherrypy
自身的重大限制,我已经从 cherrypy
恢复:这里有几个我的问题
我通过了那些有一些伤疤但仍然完整的。还有其他问题让我感到震惊:url's
没有得到服务,而且内奸事件没有明确的结束。它通常也没有得到太多关注,并且有令人困惑的过时或不完整的文档。有 大量 的文档 - 这就是我开始使用它的原因:但是这些漏洞导致了一系列追逐兔子的情节。
Flask
和 django
有自己的问题。在 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 实例这不适用于创建和销毁请求处理程序实例的方式。
提供 class
定义而不是实例的明显要求会导致非常困难的问题。我有两个不同的 类,其中一个需要引用另一个
app = tornado.web.Application([
(r"/fusion.*", FusionListener),
(r"/admin.*", AdminListener),
])
。 AdminListener
需要对 FusionListener 的引用,因为有内部项目需要管理。在这里发送消息是一种不可接受的额外复杂性。目前的机制似乎不提供这种可能性。
在Tornado中什么样的模式可以解决这个缺点?
对于我的用例,存在持久状态和内存状态。对于前者,我们有 spark
和 postgres
存储库。对于后者,我已经设计并编写了具有实例级数据结构的应用程序。但我收集到 Tornado
launched RequestHandler
/ WebHandler
subclasses 上的实例属性不是持久的。
后者希望生活在 class 管理状态中:但由于这种设计 ot Tornado
,我不得不重新划定界限。相反,有必要将所有内容推送到全局变量。很少有人会认为这是首选设计。我一有时间就倾销tornado
。
不确定替代方案是什么:由于 cherrypy
自身的重大限制,我已经从 cherrypy
恢复:这里有几个我的问题
我通过了那些有一些伤疤但仍然完整的。还有其他问题让我感到震惊:url's
没有得到服务,而且内奸事件没有明确的结束。它通常也没有得到太多关注,并且有令人困惑的过时或不完整的文档。有 大量 的文档 - 这就是我开始使用它的原因:但是这些漏洞导致了一系列追逐兔子的情节。
Flask
和 django
有自己的问题。在 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 实例这不适用于创建和销毁请求处理程序实例的方式。