我的应用程序包含twisted“后端服务器”和django“中间件”。扭曲的部分是在collection of services中设置的.tac file来访问数据库,通过www或xml提供内容。 django部分处理与网站上用户的所有互动。
扭曲的Web服务以我认为的canonical way实例化django WSGI应用程序:
# .../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频道上,我得到了建议,在我实例化时,将对我的信号的目标服务的引用传递给django app,但正如上面的代码片段所示,django应用程序只是一个WSGIHandler
对象,即使我设法以某种方式注入服务引用,我也看不到如何从应用程序中访问它。此外,这种方法会将后端和中间件紧密地耦合在一起 - 这就是信号首先打算阻止的。如何从Django向Twisted发送通知?
答案 0 :(得分:2)
Django化的解决方案可能是将对象放入settings.py
。这当然是可怕的。但是,由于Django始终依赖于这个全局状态,甚至没有任何其他广为人知或使用的机制来为您的应用程序提供状态,您可能只需要忍受它。
您可以在tac文件中添加以下内容:
import settings
settings.twisted_listener = your_service
这不是一个建议,而是“可能没有比这更清洁的方式”。在一个比这个更好的世界中,Django不会有settings.py
。它将具有接受用于配置应用程序的参数的API。