2012-10-29 67 views
2

我有一個金字塔應用程序,它也有一些扭曲的代碼,所以我想用twistd爲應用程序服務,以一石二鳥的方式。服務使用扭曲的金字塔應用程序

這裏是我的.tac文件:

from twisted.web.server import Site 
from twisted.web.wsgi import WSGIResource 
from twisted.internet import reactor 
from twisted.application import internet, service 
import os 

from pyramid.paster import get_app, setup_logging 

config='/path/to/app/production.ini' 
config = os.path.abspath(config) 
port = 8888 

application = get_app(config, 'main') 

# Twisted WSGI server setup... 
resource = WSGIResource(reactor, reactor.getThreadPool(), application) 
factory = Site(resource) 

service = internet.TCPServer(port, factory) 

service.setServiceParent(application) 

要運行這個我用:

twistd -y myApp.tac 

我收到錯誤告訴我,get_app()方法不返回一個對象,可以以這種方式使用。例如:

"Failed to load application: 'PrefixMiddleware' object has no attribute 'addService'" 

使用twistd運行金字塔應用程序的最佳方式是什麼?

+0

看起來你的自我回答是正確的,但在未來,請附上完整的回溯,以及你輸入的完整shell命令來獲取錯誤。 – Glyph

回答

2

我找到了一個工作解決方案。這裏是工作.tac文件:

from twisted.web.server import Site 
from twisted.web.wsgi import WSGIResource 
from twisted.internet import reactor 
from twisted.application import internet, service 
import os 

from pyramid.paster import get_app, setup_logging 

config='/path/to/app/production.ini' 
config = os.path.abspath(config) 
port = 8888 

# Get the WSGI application 
myApp = get_app(config, 'main') 

# Twisted WSGI server setup 
resource = WSGIResource(reactor, reactor.getThreadPool(), myApp) 
factory = Site(resource) 

# Twisted Application setup 
application = service.Application('mywebapp') 
internet.TCPServer(port, factory).setServiceParent(application) 

get_app()獲取金字塔WSGI應用程序,而internet.TCPServer需要一個扭曲的應用對象,所以這些不應混淆。

此代碼將啓動TCP端口8888

如果有人要實現這更好/更清晰的方式上的應用程序,請添加您的答案。

+0

你堅持使用這個解決方案嗎?它是穩定的嗎? – rnix

+0

@mix據我所知,它仍在運行。我不確定,因爲我不再擁有代碼/服務,而且我從未在生產中嘗試過它。你有什麼經驗? – Lars

+0

還沒有;)我只是有一些扭曲的東西和一個金字塔應用程序,並認爲作爲一項服務運行。感謝您的反饋 – rnix

3

您可以在Twisted Web的twistd插件中使用WSGI支持來縮短這一點並使其更易於配置。創建一個模塊,這樣的:

from pyramid.paster import get_app 

config = '/path/to/app/production.ini' 
myApp = get_app(config, 'main') 

然後運行twistd這樣的:

$ twistd web --port tcp:8888 --wsgi foo.myApp 

哪裏foo是您創建的模塊的名稱。

+0

注意:在最近版本的twistd中需要'--port tcp:8888'。 – coldfix

+0

謝謝,編輯答案 –