WsgiStack class, eventletserver.serve.

Trying to work toward a simple API that anyone can use to start an eventlet-based server composed of several WSGI apps.
This commit is contained in:
Michael Gundlach
2010-08-05 23:35:16 -04:00
parent 1d5e89286d
commit f193f7b95f
3 changed files with 29 additions and 10 deletions

View File

@@ -0,0 +1,7 @@
import eventlet
import eventlet.wsgi
eventlet.patcher.monkey_patch(all=False, socket=True)
def serve(app, port):
sock = eventlet.listen(('0.0.0.0', port))
eventlet.wsgi.server(sock, app)

View File

@@ -1,11 +1,10 @@
import eventlet
import eventlet.wsgi
eventlet.patcher.monkey_patch(all=False, socket=True)
import eventletserver
import carrot.connection
import carrot.messaging
import itertools
import routes
# See http://pythonpaste.org/webob/ for usage
from webob.dec import wsgify
from webob import exc, Request, Response
@@ -49,6 +48,19 @@ class WSGILayer(object):
raise NotImplementedError("You must implement __call__")
class WsgiStack(WSGILayer):
def __init__(self, wsgi_layers):
bottom_up = list(reversed(wsgi_layers))
app, remaining = bottom_up[0], bottom_up[1:]
for layer in remaining:
layer.application = app
app = layer
super(WsgiStack, self).__init__(app)
@wsgify
def __call__(self, req):
return self.application
class Debug(WSGILayer):
@wsgify
def __call__(self, req):
@@ -101,9 +113,6 @@ class Reverse(WSGILayer):
@wsgify
def __call__(self, req):
inner_resp = req.get_response(self.application)
print "+" * 80
Debug()(req)
print "*" * 80
resp = Response()
resp.app_iter = itertools.imap(lambda x: x[::-1], inner_resp.app_iter)
return resp
@@ -118,5 +127,10 @@ class File(WSGILayer):
req.response = Response()
req.response.app_iter = myfile
sock = eventlet.listen(('localhost', 12345))
eventlet.wsgi.server(sock, Debug(Auth(FileRouter(Message()))))
wsgi_layers = [
Auth(),
Debug(),
FileRouter(),
Message(),
]
eventletserver.serve(app=WsgiStack(wsgi_layers), port=12345)

View File

@@ -26,8 +26,6 @@ import logging
import multiprocessing
import os
import time
import tornado.web
from twisted.internet import defer
from nova import datastore
from nova import exception