Session handling for cromlech using wsgistate
Project description
cromlech.beaker is an integration of beaker to cromlech for session management.
Context manager
Let’s import some helpers:
>>> import pytest >>> from webtest import TestApp >>> SK = 'session.key'
And our session controller:
>>> from cromlech.wsgistate import WsgistateSession >>> from cromlech.wsgistate.controlled import WsgistateSession >>> def simple_app(environ, start_response): ... """retained visited path, raise exception if path contain 'fail' ... """ ... with WsgistateSession(environ, SK) as session: ... path = environ['PATH_INFO'] ... history = session.setdefault('path', []) ... history.append(path) ... if path == '/fail': ... raise ValueError ... start_response('200 OK', [('Content-type', 'text/plain')]) ... return [', '.join(history)]
Then run it with wsgistate middelware:
>>> from cromlech.wsgistate import session_wrapper >>> wsgi_app = TestApp(session_wrapper(simple_app, session_key=SK)) >>> result = wsgi_app.get('/foo') >>> result.status '200 OK' >>> result.body '/foo'>>> result = wsgi_app.get('/bar') >>> result.status '200 OK' >>> result.body '/foo, /bar'
If application raise an exception, the context manager wont save the session:
>>> result = wsgi_app.get('/fail') Traceback (most recent call last): ... ValueError >>> result.status '200 OK' >>> result.body '/foo, /bar'
Testing the transaction awareness
>>> import transaction >>> from cromlech.wsgistate import SessionStateException>>> def transactional_app(environ, start_response): ... ... with transaction.manager as tm: ... with WsgistateSession(environ, SK, tm) as session: ... session['crom'] = 'Pyramid' ... tm.abort() ... ... assert not session ... ... with transaction.manager as tm: ... with WsgistateSession(environ, SK, tm) as session: ... session['crom'] = 'Crom' ... ... with transaction.manager as tm: ... with WsgistateSession(environ, SK, tm) as session: ... session['lech'] = 'Lech' ... sp1 = tm.savepoint() ... ... session['crom'] = 'Zope' ... session['lech'] = 'Quack' ... sp2 = tm.savepoint() ... ... session['crom'] = 'PHP' ... sp3 = tm.savepoint() ... ... sp2.rollback() ... assert session['crom'] == 'Zope' ... assert session['lech'] == 'Quack' ... ... session['crom'] = 'Zorglub' ... session['lech'] = 'Zimbabwe' ... ... sp1.rollback() ... ... # outside of a transaction, the writing is prohibited ... with pytest.raises(SessionStateException) as e: ... session['fail'] = True ... ... assert e.value.message == ( ... "Session's current state disallows writing") ... ... start_response('200 OK', [('Content-type', 'text/plain')]) ... return [session.get('crom', ''), session.get('lech', '')]>>> wsgi_app = TestApp(session_wrapper(transactional_app, session_key=SK)) >>> result = wsgi_app.get('/bar') >>> result.body 'CromLech'
Changelog
0.3b2 (2017-03-18)
Added python3 compatibility
0.3b1 (2016-11-29)
Added Timeout exception and bubbling up through the environ, to know when a session expired.
0.2 (2014-08-06)
Forwarding the local_conf options to the decorator, for further configuration
0.1 (2013-03-13)
Initial release
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.