Package: zope.app.session
This package provides session support.Zope3 Session ImplementationNoteAll interfaces and implementations provided by this package
have been migrated tozope.session. This package now
merely provides ZMI menu configuration.OverviewCaution!Session data is maintained on the server. This gives a security
advantage in that we can assume that a client has not tampered with
the data.  However, this can have major implications for scalability
as modifying session data too frequently can put a significant load
on servers and in extreme situations render your site unusable.
Developers should keep this in mind when writing code or risk
problems when their application is run in a production environment.Applications requiring write-intensive session implementations (such
as page counters) should consider using cookies or specialized
session implementations.Sessions allow us to fake state over a stateless protocol - HTTP.
We do this by having a unique identifier stored across multiple
HTTP requests, be it a cookie or some id mangled into the URL.TheIClientIdManagerUtility provides this unique id. It is
responsible for propagating this id so that future requests from the
client get the same id (eg. by setting an HTTP cookie). (Note that
this, and all interfaces, are imported from this package for
demonstration purposes only. They have been moved tozope.session.interfaces) This utility is used when we adapt the
request to the unique client id:>>> from zope.app.session.interfaces import IClientId
>>> IClientId
<InterfaceClass zope.session.interfaces.IClientId>
>>> client_id = IClientId(request)TheISessionadapter gives us a mapping that can be used to store
and retrieve session data. A unique key (the package id) is used
to avoid namespace clashes:>>> from zope.app.session.interfaces import ISession
>>> pkg_id = 'products.foo'
>>> session = ISession(request)[pkg_id]
>>> session['color'] = 'red'>>> session2 = ISession(request)['products.bar']
>>> session2['color'] = 'blue'>>> session['color']
'red'
>>> session2['color']
'blue'Data StorageThe actual data is stored in anISessionDataContainerutility.ISessionchooses whichISessionDataContainershould be used by
looking up as a named utility using the package id. This allows
the site administrator to configure where the session data is actually
stored by adding a registration for desiredISessionDataContainerwith the correct name.>>> from zope.app.session.interfaces import ISessionDataContainer
>>> from zope.component import getUtility
>>> sdc = getUtility(ISessionDataContainer, pkg_id)
>>> sdc[client_id][pkg_id] is session
True
>>> sdc[client_id][pkg_id]['color']
'red'If noISessionDataContainerutility can be located by name using the
package id, then the unnamedISessionDataContainerutility is used as
a fallback. An unnamedISessionDataContaineris automatically created
for you, which may replaced with a different implementation if desired.>>> ISession(request)['unknown'] \
...     is getUtility(ISessionDataContainer)[client_id]['unknown']
TrueTheISessionDataContainercontainsISessionDataobjects, andISessionDataobjects in turn containISessionPkgDataobjects. You
should never need to know this unless you are writing administrative
views for the session machinery.>>> from zope.app.session.interfaces import ISessionData, ISessionPkgData
>>> ISessionData.providedBy(sdc[client_id])
True
>>> ISessionPkgData.providedBy(sdc[client_id][pkg_id])
TrueTheISessionDataContaineris responsible for expiring session data.
The expiry time can be configured by settings itstimeoutattribute.>>> sdc.timeout = 1200 # 1200 seconds or 20 minutesRestrictionsData stored in the session must be persistent or picklable.>>> class NoPickle(object):
...     def __getstate__(self):
...         raise TypeError("Cannot serialize")
>>> session['oops'] = NoPickle()
>>> import transaction
>>> transaction.commit()
Traceback (most recent call last):
...
TypeError: Cannot serializePage TemplatesSession data may be accessed in page template documents using
TALES:<span tal:content="request/session:products.foo/color | default">
    green
</span>or:<div tal:define="session request/session:products.foo">
    <script type="text/server-python">
        try:
            session['count'] += 1
        except KeyError:
            session['count'] = 1
    </script>

    <span tal:content="session/count" />
</div>CHANGES5.0 (2023-02-10)Drop support for Python 2.7, 3.5, 3.6.Add support for Python 3.8, 3.9, 3.10, 3.11.4.1.0 (2018-10-22)Add support for Python 3.7.4.0.0 (2017-05-29)Add support for Python 3.4, 3.5, 3.6 and PyPy.Remove dependency onZODB3and other packages that are not used
by this package, leaving behind onlyzope.session. Packages that
are used during testing are now test dependencies.3.6.2 (2010-09-01)Remove undeclared dependency onzope.deferredimport.3.6.1 (2010-02-06)Include meta.zcml from zope.securitypolicy3.6.0 (2009-02-01)Usezope.siteinstead ofzope.app.folderin tests.3.5.2 (2009-01-27)Fixed tearDown-Error in tests.3.5.1 (2007-10-31)ResolveZopeSecurityPolicydeprecation warning.3.5.0 (2007-09-27)A release to override an untagged, unreasoned dev release indownload.zope.org/distribution.3.4.3 (2007-09-27)Fix package meta-data.3.4.2 (2007-09-24)rebumped to replace faulty eggadded missing dependecy tozope.session3.4.1 (2007-09-24)Added missing files to egg distribution3.4.0 (2007-09-24)Initial documented release