made the WSGI compatibility layer lazy, nobody uses it anyway and it may be broken, probably should be removed

This commit is contained in:
mdipierro
2013-06-30 09:19:26 -05:00
parent d218b052a1
commit 3407cf6584
4 changed files with 52 additions and 53 deletions
+1 -1
View File
@@ -1 +1 @@
Version 2.6.0-development+timestamp.2013.06.29.17.06.13
Version 2.6.0-development+timestamp.2013.06.30.09.18.36
-1
View File
@@ -83,7 +83,6 @@ class Request(Storage):
def __init__(self):
Storage.__init__(self)
self.wsgi = Storage() # hooks to environ and start_response
self.env = Storage()
self.cookies = Cookie.SimpleCookie()
self.get_vars = Storage()
+49 -51
View File
@@ -257,51 +257,55 @@ def serve_controller(request, response, session):
raise HTTP(response.status, page, **response.headers)
def start_response_aux(status, headers, exc_info, response=None):
"""
in controller you can use::
- request.wsgi.environ
- request.wsgi.start_response
to call third party WSGI applications
"""
response.status = str(status).split(' ', 1)[0]
response.headers = dict(headers)
return lambda *args, **kargs: response.write(escape=False, *args, **kargs)
def middleware_aux(request, response, *middleware_apps):
"""
In you controller use::
class LazyWSGI(object):
def __init__(self, environ, request, response):
self.wsgi_environ = environ
self.request = request
self.response = response
@property
def environ(self):
if not hasattr(self,'_environ'):
new_environ = self.wsgi_environ
new_environ['wsgi.input'] = self.request.body
new_environ['wsgi.version'] = 1
self._environ = new_environ
return self._environ
def start_response(self,status='200', headers=[], exec_info=None):
"""
in controller you can use::
- request.wsgi.environ
- request.wsgi.start_response
to call third party WSGI applications
"""
self.response.status = str(status).split(' ', 1)[0]
self.response.headers = dict(headers)
return lambda *args, **kargs: \
self.response.write(escape=False, *args, **kargs)
def middleware(self,*a):
"""
In you controller use::
@request.wsgi.middleware(middleware1, middleware2, ...)
to decorate actions with WSGI middleware. actions must return strings.
uses a simulated environment so it may have weird behavior in some cases
"""
def middleware(f):
def app(environ, start_response):
data = f()
start_response(response.status, response.headers.items())
if isinstance(data, list):
return data
return [data]
for item in middleware_apps:
app = item(app)
def caller(app):
wsgi = request.wsgi
return app(wsgi.environ, wsgi.start_response)
return lambda caller=caller, app=app: caller(app)
return middleware
def environ_aux(environ, request):
new_environ = copy.copy(environ)
new_environ['wsgi.input'] = request.body
new_environ['wsgi.version'] = 1
return new_environ
to decorate actions with WSGI middleware. actions must return strings.
uses a simulated environment so it may have weird behavior in some cases
"""
def middleware(f):
def app(environ, start_response):
data = f()
start_response(self.response.status,
self.response.headers.items())
if isinstance(data, list):
return data
return [data]
for item in middleware_apps:
app = item(app)
def caller(app):
return app(self.environ, self.start_response)
return lambda caller=caller, app=app: caller(app)
return middleware
ISLE25 = sys.version_info[1] <= 5
@@ -537,13 +541,7 @@ def wsgibase(environ, responder):
# expose wsgi hooks for convenience
# ##################################################
request.wsgi.environ = environ_aux(environ, request)
request.wsgi.start_response = \
lambda status='200', headers=[], \
exec_info=None, response=response: \
start_response_aux(status, headers, exec_info, response)
request.wsgi.middleware = \
lambda *a: middleware_aux(request, response, *a)
request.wsgi = LazyWSGI(environ, request, response)
# ##################################################
# load cookies
+2
View File
@@ -638,6 +638,8 @@ def regex_url_in(request, environ):
if match.group('c') == 'static':
application = match.group('a')
version, filename = None, match.group('z')
if not filename:
raise HTTP(404)
items = filename.split('/', 1)
if regex_version.match(items[0]):
version, filename = items