DjangoをTwistedで・・・・挫折
うまくいかんなー。
つーかTwisted初心者なのに無謀だね。
from django.core.handlers.base import BaseHandler
from twisted.web2 import log, wsgi
class WrapDjangoWSGIHandler( BaseHandler ):
def __call__( self, environ, start_response ):
from django.conf import settings
if settings.ENABLE_PSYCO:
import psyco
psyco.profile()
# Set up middleware if needed. We couldn't do this earlier,because settings weren't available.
if self._request_middleware is None:
self.load_middleware ()
dispatcher.send( signal=signals.request_started )
try:
request = WSGIRequest( environ )
# modified by cenyongh to support defer
di = defer.maybeDeferred( self.get_response, request.path,request )
def cb( response ):
return self.done( response, start_response )
di.addCallback( cb )
finally:
dispatcher.send( signal=signals.request_finished )
return di;
def done( self, response, start_response ):
# Apply response middleware
for middleware_method in self._response_middleware:
response = middleware_method( request, response )
try:
status_text = STATUS_CODE_TEXT[ response.status_code]
except KeyError:
status_text = 'UNKNOWN STATUS CODE'
status = '%s %s' % ( response.status_code, status_text )
response_headers = response.headers.items ()
for c in response.cookies.values():
response_headers.append( ( 'Set-Cookie', c.output(header='' ) ) )
start_response( status, response_headers )
return response
class WrapTW2WSGIResource( wsgi.WSGIResource ):
def renderHTTP( self, req ):
from twisted.internet import reactor
# Do stuff with WSGIHandler.
# modified by cenyongh to support defer
handler = WrapTW2WSGIHandler( self.application, req )
# Get deferred
d = handler.responseDeferred
# Run it in a thread
reactor.callInThread( handler.run )
return d
class WrapTW2WSGIHandler( wsgi.WSGIHandler ):
def run( self ):
from twisted.internet import reactor,
# Called in application thread
try:
result = self.application ( self.environment, self.startWSGIResponse )
print result
# modified by cenyongh to support defer
def cb( response ):
self.handleResult( [response.content] )
result.addCallback( cb )
except Exception, e:
if not self.headersSent:
reactor.callFromThread( self.__error, failure.Failure())
else:
reactor.callFromThread( self.stream.finish,failure.Failure() )
from twisted.application import service, strports
from twisted.web2 import server, channel
root = WrapTW2WSGIResource( WrapDjangoWSGIHandler() )
res = log.LogWrapperResource(root)
log.DefaultCommonAccessLoggingObserver().start()
site = server.Site(res)
application = service.Application("server")
# Serve it via standard HTTP on port 8080
s = strports.service('tcp:8080', channel.HTTPFactory(site))
s.setServiceParent(application)たぶんこんな感じ。でいいはずなんだけど動かない。
Django本家からのソースなんだけど何が悪いのかサッパリわからん。
でも実際にCOMETするとなると負荷など考えて
- 通常用のWebサーバ
- COMET用のWebサーバ
というように分けるべきなのかね?
ぜーんぶTwistedっていうのもなんだかな?と思ってしまったので。
まーわけたらわけたでセッションどーすんの?って話があるとは思うけど。
ものによるけどセッションのデータがDBにはいってりゃなんとかなるはずなんだよねーとかいってみる。
というかTwistedってさクライアント書くよかサーバ書く方がコード量少なくない?
気のせい?
わかってくると楽しいんだろうなーTwisted。
サーバ書くの楽だもん。
さらにしらねー機能いっぱいありそうだし。
TimeServiceとかちょーらくだお。
うくく。