【问题标题】:how to send a notification from django to twisted?如何从 django 向twisted 发送通知?
【发布时间】:2024-01-07 17:31:01
【问题描述】:

我的应用程序由一个twisted“后端服务器”和一个django“中间件”组成。扭曲的部分是collection of services 设置在.tac file 中以访问数据库,通过www 或xml 提供内容。 django 部分处理网站上与用户的所有交互。

twisted Web 服务将 django WSGI 应用程序实例化为我认为的 canonical way

# .../wsgi/app.py:
from django.core.handlers.wsgi import WSGIHandler
application = WSGIHandler()

# .../web_service.py:
# (twisted imports...)
from wsgi.app import application
class WebServer(Resource):
    def __init__(self):
        Resource.__init__(self)
        self.wsgi_resource = WSGIResource(reactor,
                                          reactor.getThreadPool(),
                                          application)

现在我需要发送一个通知,例如用户已从 django 部分登录到扭曲部分,理想情况下是其中一个服务。我试图为此目的使用django signal。发送信号有效,但我真的不知道如何获取对扭曲对象的引用以用作信号的目标:

  • 这些服务都在 app.tac 中实例化,并且一旦扭曲的应用程序运行,似乎无法从该文件导入这些对象或重新获得对它们的引用。
  • #twisted IRC 频道上,当我实例化该服务时,我得到了建议,该服务的引用应该是我的信号的目标,但正如上面的代码 sn-p 所示,django 应用程序只是一个WSGIHandler 对象,即使我设法以某种方式将服务引用注入其中,我也看不到如何从应用程序内访问它。此外,这种方法会将后端和中间件紧密地耦合在一起——这是信号首先要防止的。

如何从 Django 向 Twisted 发送通知?

【问题讨论】:

    标签: python django twisted signals django-signals


    【解决方案1】:

    Django 化的解决方案可能是将一个对象放入settings.py。当然,这很可怕。然而,由于 Django 一直依赖于这块全局状态,以至于它甚至没有任何其他广为人知或使用的机制来为您的应用程序提供状态,您可能只需要忍受它。

    您可以在 tac 文件中添加类似的内容:

    import settings
    settings.twisted_listener = your_service
    

    这与其说是一个建议,不如说是“可能没有比这更清洁的方法”了。在一个比这个更好的世界里,Django 不会有settings.py。它将具有接受用于配置应用程序的参数的 API。

    【讨论】: