[Zope-Checkins] SVN: Zope/branches/regebro-wsgi_support2/lib/python/Zope2/Startup/ Twisted support.

Lennart Regebro regebro at gmail.com
Sun Apr 30 05:28:13 EDT 2006


Log message for revision 67759:
  Twisted support.
  

Changed:
  U   Zope/branches/regebro-wsgi_support2/lib/python/Zope2/Startup/__init__.py
  U   Zope/branches/regebro-wsgi_support2/lib/python/Zope2/Startup/handlers.py
  U   Zope/branches/regebro-wsgi_support2/lib/python/Zope2/Startup/zopeschema.xml

-=-
Modified: Zope/branches/regebro-wsgi_support2/lib/python/Zope2/Startup/__init__.py
===================================================================
--- Zope/branches/regebro-wsgi_support2/lib/python/Zope2/Startup/__init__.py	2006-04-30 08:25:20 UTC (rev 67758)
+++ Zope/branches/regebro-wsgi_support2/lib/python/Zope2/Startup/__init__.py	2006-04-30 09:28:13 UTC (rev 67759)
@@ -20,12 +20,11 @@
 import socket
 from re import compile
 from socket import gethostbyaddr
+import twisted.internet.reactor
 
 import ZConfig
-
 from ZConfig.components.logger import loghandler
 
-
 logger = logging.getLogger("Zope")
 started = False
 
@@ -96,7 +95,10 @@
         self.makePidFile()
         self.setupInterpreter()
         self.startZope()
-        self.registerSignals()
+        from App.config import getConfiguration
+        config = getConfiguration()
+        if not config.twisted_servers:
+            self.registerSignals()
         # emit a "ready" message in order to prevent the kinds of emails
         # to the Zope maillist in which people claim that Zope has "frozen"
         # after it has emitted ZServer messages.
@@ -106,10 +108,15 @@
     def run(self):
         # the mainloop.
         try:
-            import ZServer
-            import Lifetime
-            Lifetime.loop()
-            sys.exit(ZServer.exit_code)
+            from App.config import getConfiguration
+            config = getConfiguration()
+            if config.twisted_servers:
+                twisted.internet.reactor.run()
+            else:
+                import ZServer
+                import Lifetime
+                Lifetime.loop()
+                sys.exit(ZServer.exit_code)
         finally:
             self.shutdown()
 

Modified: Zope/branches/regebro-wsgi_support2/lib/python/Zope2/Startup/handlers.py
===================================================================
--- Zope/branches/regebro-wsgi_support2/lib/python/Zope2/Startup/handlers.py	2006-04-30 08:25:20 UTC (rev 67758)
+++ Zope/branches/regebro-wsgi_support2/lib/python/Zope2/Startup/handlers.py	2006-04-30 09:28:13 UTC (rev 67759)
@@ -1,8 +1,15 @@
 import os
 import sys
+import time
+import logging
 from re import compile
 from socket import gethostbyaddr
 
+import twisted.internet
+from twisted.application.service import MultiService
+import zope.app.appsetup.interfaces
+import zope.app.twisted.main
+
 # top-level key handlers
 
 
@@ -133,7 +140,7 @@
         "'catalog-getObject-raises' option will be removed in Zope 2.10:\n",
         DeprecationWarning)
 
-        from Products.ZCatalog import CatalogBrains 
+        from Products.ZCatalog import CatalogBrains
         CatalogBrains.GETOBJECT_RAISES = bool(value)
 
     return value
@@ -143,7 +150,8 @@
 def root_handler(config):
     """ Mutate the configuration with defaults and perform
     fixups of values that require knowledge about configuration
-    values outside of their context. """
+    values outside of their context.
+    """
 
     # Set environment variables
     for k,v in config.environment.items():
@@ -165,7 +173,7 @@
     instanceprod = os.path.join(config.instancehome, 'Products')
     if instanceprod not in config.products:
         config.products.append(instanceprod)
-    
+
     import Products
     L = []
     for d in config.products + Products.__path__:
@@ -190,6 +198,23 @@
                         config.cgi_environment,
                         config.port_base)
 
+    if not config.twisted_servers:
+        config.twisted_servers = []
+    else:
+        # Set number of threads (reuse zserver_threads variable)
+        twisted.internet.reactor.suggestThreadPoolSize(config.zserver_threads)
+
+        # Create a root service
+        rootService = MultiService()
+
+        for server in config.twisted_servers:
+            service = server.create(None)
+            service.setServiceParent(rootService)
+
+        rootService.startService()
+        twisted.internet.reactor.addSystemEventTrigger(
+            'before', 'shutdown', rootService.stopService)
+
     # set up trusted proxies
     if config.trusted_proxies:
         import ZPublisher.HTTPRequest
@@ -217,3 +242,29 @@
     if isIp_(host): return [host]
     return gethostbyaddr(host)[2]
 
+# XXX Need to find a better place for this.
+
+import twisted.web2.wsgi
+import twisted.web2.server
+import twisted.web2.log
+
+try:
+    from twisted.web2.http import HTTPFactory
+except ImportError:
+    from twisted.web2.channel.http import HTTPFactory
+
+from zope.component import provideUtility
+from zope.app.twisted.server import ServerType, SSLServerType
+from zope.app.twisted.interfaces import IServerType
+from ZPublisher.WSGIPublisher import publish_module
+
+def createHTTPFactory(ignored):
+    resource = twisted.web2.wsgi.WSGIResource(
+        publish_module)
+    resource = twisted.web2.log.LogWrapperResource(resource)
+
+    return HTTPFactory(twisted.web2.server.Site(resource))
+
+http = ServerType(createHTTPFactory, 8080)
+
+provideUtility(http, IServerType, 'Zope2-HTTP')

Modified: Zope/branches/regebro-wsgi_support2/lib/python/Zope2/Startup/zopeschema.xml
===================================================================
--- Zope/branches/regebro-wsgi_support2/lib/python/Zope2/Startup/zopeschema.xml	2006-04-30 08:25:20 UTC (rev 67758)
+++ Zope/branches/regebro-wsgi_support2/lib/python/Zope2/Startup/zopeschema.xml	2006-04-30 09:28:13 UTC (rev 67759)
@@ -11,6 +11,12 @@
   <import package="tempstorage"/>
   <import package="Zope2.Startup" file="warnfilter.xml"/>
 
+  <sectiontype name="server" datatype="zope.app.twisted.server.ServerFactory">
+    <key name="type" required="yes" />
+    <key name="address" datatype="inet-address" />
+    <key name="backlog" datatype="integer" default="50" />
+  </sectiontype>
+
   <sectiontype name="logger" datatype=".LoggerFactory">
     <description>
       This "logger" type only applies to access and request ("trace")
@@ -805,7 +811,9 @@
      <metadefault>on</metadefault>
   </key>
 
+  <multisection type="server" name="*" attribute="twisted_servers" />
   <multisection type="ZServer.server" name="*" attribute="servers"/>
+
   <key name="port-base" datatype="integer" default="0">
     <description>
       Base port number that gets added to the specific port numbers



More information about the Zope-Checkins mailing list