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とかちょーらくだお。
うくく。