From 16bf2b6740697c756bcd9f20cb39f8df4dd2c5eb Mon Sep 17 00:00:00 2001 From: ianb Date: Wed, 21 Jun 2006 04:26:25 +0000 Subject: Made it possible to create the session after start_response is called but before the first content is sent to the server --- paste/session.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'paste/session.py') diff --git a/paste/session.py b/paste/session.py index b10601f..c2feac6 100644 --- a/paste/session.py +++ b/paste/session.py @@ -42,18 +42,29 @@ class SessionMiddleware(object): def __call__(self, environ, start_response): session_factory = SessionFactory(environ, **self.factory_kw) environ['paste.session.factory'] = session_factory + remember_headers = [] def session_start_response(status, headers, exc_info=None): if not session_factory.created: + remember_headers[:] = [status, headers] return start_response(status, headers) headers.append(session_factory.set_cookie_header()) return start_response(status, headers, exc_info) app_iter = self.application(environ, session_start_response) - if session_factory.used: - return wsgilib.add_close(app_iter, session_factory.close) - else: - return app_iter + def start(): + if session_factory.created and remember_headers: + # Tricky bastard used the session after start_response + status, headers = remember_headers + headers.append(session_factory.set_cookie_header()) + exc = ValueError( + "You cannot get the session after content from the " + "app_iter has been returned") + start_response(status, headers, (exc.__class__, exc, None)) + def close(): + if session_factory.used: + session_factory.close() + return wsgilib.add_start_close(app_iter, start, close) class SessionFactory(object): -- cgit v1.2.1