[Zope-dev] connecting server code to the ZODB
pw_lists at slinkp.com
Mon Nov 8 15:03:26 EST 2004
On Mon, Nov 08, 2004 at 11:22:13AM -0000, Tim Hicks wrote:
> Paul Winkler said:
> >> > What I really want to be able to do from the server code is something
> >> like::
> >> >
> >> > root = magic_that_gets_me_zodb_root()
> >> That magic is basically (from memory):
> >> import Zope
> >> Zope.startup()
> >> root = Zope.app()
> >> But note that starting up a zope is slow, so you don't want to do that
> >> very often.
> > Well, in this case zope is already running.
> Ok, so I could simply drop the Zope.startup() line and things would be
> fine (and quick), right?
I haven't tried it, but I think doing Zope.app() will try to
acquire a lock on the database and it is already locked by
the running Zope (or ZEO). So I don't think you can do that.
> > I think you should use the existing publisher machinery.
> > Given an SMTPRequest instance foo, you should be able to
> > do foo.traverse(path, response) and get back an object.
> > This monster method is defined in ZPublisher/BaseRequest.py
> What does using foo.traverse() buy me over simply accessing the ZODB
> objects 'by hand', as in root = Zope.app()?
Well, for one thing it might actually work ;-)
Note, I'm not sure what your code looks like - if you already
have a reference to any persistent object (as long as it's
Traversable which basically anything of interest to you would be),
you can get the root by doing root = someObject.getPhysicalRoot().
> It seems I get security by
> using foo.traverse() - although I'm not sure whether that is really
> necessary for my purposes. Would it also deal with any ZODB transaction
> stuff for me that I would otherwise have to sort out -
> get_transaction().commit(). If I'm just reading ZODB objects (not
> writing), does the transaction stuff even matter?
I'm afraid I don't know either of those, I've never tried to hook into
zope from within a ZServer server.
Generally a transaction runs for the duration of one request,
but I am not clear on who manages that: is it ZPublisher?
It looks like transactions are managed in ZPublisher/Publish.py, but I have
never looked at that code and don't have time to figure it out now.
More information about the Zope-Dev