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

View File

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