"""
How to access the session from guard's logout function,
with an example of remembering values within the session.
"""
# A resource for our site
#
import random
from zope.interface import implements,Interface
from nevow import guard
from nevow import rend
from nevow import loaders
from nevow import tags
from nevow import url
from nevow.inevow import ISession
class IValueHistory(Interface):
pass
class ISessionValue(Interface):
pass
class MyRootResource(rend.Page):
"""Some resource."""
addSlash = True
def render_randomNumber(self, ctx, data):
session = ISession(ctx)
number = random.randrange(0, 100)
session.setComponent(ISessionValue, number)
history = session.getComponent(IValueHistory)
if history is None:
history = []
history.append(number)
session.setComponent(IValueHistory, history)
return str(number)
def render_valueHistory(self, ctx, data):
session = ISession(ctx)
history = session.getComponent(IValueHistory, default=[])
return repr(history[:-1])
docFactory = loaders.stan(
T.html[
T.body[
T.p['Your random number is: ', render_randomNumber],
T.p['Previous random numbers were: ', render_valueHistory],
T.div[T.a(href=url.here)['Click here to get a new number']],
T.div[T.a(href=url.here.child(guard.LOGOUT_AVATAR))['Click here to log out']],
]
]
)
# Cred-specific implementation
#
from twisted.cred.portal import IRealm
from nevow.inevow import IResource
class Mind:
def __init__(self, request, credentials):
self.request = request
self.credentials = credentials
class MyRealm:
implements(IRealm)
def requestAvatar(self, avatar_id, mind, *interfaces):
if IResource in interfaces:
return (
IResource,
MyRootResource(),
self.createLogout(avatar_id, mind)
)
raise NotImplementedError
def createLogout(self, avatar_id, mind):
def logout():
# This will be a nevow.guard.GuardSession instance
session = mind.request.getSession()
values = session.getComponent(IValueHistory)
session.unsetComponent(IValueHistory)
print 'Logging avatar', avatar_id, 'out of session', session
print 'Random numbers generated were', values
return logout
# Code for examples.tac
#
from twisted.cred.portal import Portal
from twisted.cred.checkers import AllowAnonymousAccess
from twisted.cred.credentials import IAnonymous
from nevow.guard import SessionWrapper
def createResource():
portal = Portal(MyRealm())
portal.registerChecker(AllowAnonymousAccess(), IAnonymous)
# Here is the vital part: specifying a mindFactory for guard to use
return SessionWrapper(portal, mindFactory=Mind)
|