[Twisted-web] Remembering things in context from a Realm
Matt Goodall
matt at pollenation.net
Tue Sep 28 08:04:06 MDT 2004
On Tue, 2004-09-28 at 14:48, Donovan Preston wrote:
> On Sep 28, 2004, at 12:41 AM, Alex Levy wrote:
>
> > I have a Realm class that does something akin to the following:
> >
> > class MyRealm:
> > def requestAvatar(self, id, mind, *interfaces):
> > if IResource is in interfaces:
> > user = figureOutWhoTheUserIs(id)
> > resource = getResourceForUser(user)
> > resource.remember(user, ICurrentUser)
> > return (IResource, resource, lambda:None)
> >
> > ...and this doesn't seem to be working with the ubiquitous context.
> > _Should_
> > it work, or do I need a new way to do something like this?
> >
> > Help is appreciated; I'm trying hard to get back in the loop. :/
>
> You are going to have to put user as an attribute on resource, then
> remember it in the context in an overridden locateChild.
Or, you can create a IResource wrapper that is used like this from
requestAvatar:
return (IResource, RememberWrapper(resource, user), lambda:None)
and looks like this (untested):
class RememberWrapper:
__implements__ = inevow.IResource,
def __init__(self, resource, user):
self.resource = resource
self.user = user
def locateChild(self, ctx, segments):
ctx.remember(self.user, ICurrentUser)
return self.resource, segments
def renderHTTP(self, ctx):
ctx.remember(self.user, ICurrentUser)
return self.resource.renderHTTP(ctx)
This avoids setting attributes on the resource which means you can reuse
a single *real* resource object if that makes sense to your application.
Hope this helps.
Cheers, Matt
--
__
/ \__ Matt Goodall, Pollenation Internet Ltd
\__/ \ w: http://www.pollenation.net
__/ \__/ e: matt at pollenation.net
/ \__/ \ t: +44 (0)113 2252500
\__/ \__/
/ \ Any views expressed are my own and do not necessarily
\__/ reflect the views of my employer.
More information about the Twisted-web
mailing list