Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

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