[Zope3-Users] Direct ZODB access in a Zope3 instance
johanc at easypublisher.com
Thu Dec 1 15:49:13 EST 2005
Brad Allen wrote:
> At 11:48 AM +0100 12/1/05, Johan Carlsson wrote:
>> To access an object in the ZODB you need to have a context
>> (that is a pointer to a object stored in ZODB, it almost alway is but
>> in some situations it's not! I've learned that the hard way).
>> If your in a browser class you will have the context of the object
>> traversed as an instance attribute (self.context).
> Ok, this helps, although I'm not completely clear on how context
> objects are generated.
If you really what too know you should read "The life of a Request".
Or you can just trust me ;-)
> From a newbie perspective, the context
> object is an elusive beast. It's not really explained anywhere
> that I could find. The Zope 3 Developer's Guide. There's a little
> section called "The context Variable" in the ZCML chapter, but
> that doesn't explain where the context comes from or what it is.
> I've seen how the context object is used in TAL, but have always
> understood it to be the local URL context.
Yes that's what it is most of the time, only when you have
view classes (IView) that call each other, for instance
when you use special kind of fields.
Here's the interfaces that define a view:
"""Components implementing this interface must have a
Usually the context must be one of the arguments of the
constructor. Adapters and views are a primary example of
context = Attribute(
"""The context of the object
This is the object being adapted, viewed, extended, etc.
"""Presentation components provide interfaces to external actors
The are created for requests, which encapsulate external actors,
request = Attribute(
The request is a surrogate for the user. It also provides the
presentation type and skin. It is of type
So as you see it's not only view that have the context, but adapters
too, well infact view are adapters now day :-)
> There were some examples of using self.context in the MessageBoard
> tutorial. For instance, below is an excerpt from page 114.
> The self.context is used in a mysterious way here. Nothing in
> the class definition binds it. It has no base class. I guess I should
> expect a child class, or a factory maybe to add the self.context
> when the class get instantiated. However, I had trouble finding that
> anywhere in the SVN copy of the MessageBoard tutorial (step 13).
Well, it gets bind when adapted and in this example it occurs
when the object is traversed and it's view is looked up.
I think it gets registered with a view class in ZCML
which turns it in to a browser view
I can agree with you that it's kind of mysterious and implicit,
in fact I think it's a consequence of the aspect-origentation.
(What ever happend to "explicit is better than implicit" ;-)
> In some other example MessageBoard classes, context is used
> as an init parameter. The doctest examples indicate that
> context can be a simple container object, not necessarily something
> in ZODB. I guess this makes sense.
Exactly, from above: "context - The context of the object
This is the object being adapted, viewed, extended, etc."
As it always have been with Zope, the source code is the best way
to understand how it works. Unfortunatelly is the Z3 source
extremely co-located, but still it's very useful to learn to find
ones way in it. After over 6 months hard studying I'm starting
to find my way round the source :-)
Here's some tips:
- ZCML is as much part of the code as anything else, so try to
learn how to find the code behind the ZCML statement.
Specially high level things like ContainerView, AddViews, and
Ah, can think of any thing else at the moment. I have to give you a
rain-check on that :-)
Johan Carlsson Tel: + 46 8 31 24 94
Colliberty Mob: + 46 70 558 25 24
Torsgatan 72 Email: johanc at easypublisher.com
SE-113 37 STOCKHOLM
More information about the Zope3-users