Zope's many hooks¶
Description
What hooks does Zope provide for application code?
Zope provides many different hooks that can be used to execute code at various times during its lifecycle. The most important ones are outlined below.
Process lifecycle¶
zope.processlifetime
defines three events:
-
IDatabaseOpened
- notified when the main ZODB has been opened, but before the root application object is set.
-
IDatabaseOpenedWithRoot
- notified later in the startup cycle, when the application root has been set and initialized.
-
IProcessStarting
- notified when the Zope startup process has completed, but before the Zope server runs (and so can listen to requests).
ZODB connection lifecycle¶
Functions that should be called just after traversal over
the
ZApplicationWrapper
as it opens a ZODB connection for the request should be
added to the
App.ZApplication.connection_open_hooks
list. They are called with a ZODB connection as their sole
argument.
The ZODB transaction provides two methods to register
hooks —
addBeforeCommitHook()
and
addAfterCommitHook()
. These can be passed functions and a (static) set of
arguments and will be called just before, and just after,
a transaction is committed. The hook function must take at
least one argument, a boolean indicating whether the
transaction succeeded.
Use
transaction.get()
to get hold of the transaction object. See
transaction.interfaces.ITransaction
for more details.
Request lifecycle¶
Request-scoped items may be protected from garbage
collection using
request._hold()
. If applicable, the item held can implement
__del__()
, which will be called when the request is destroyed.
The event
zope.publisher.events.EndRequestEvent
is triggered at the end of an event, just before any held
items are cleared.
Publication¶
The publisher notifies a number of events, which can be
used to hook into various stages of the publication
process. These are all defined in the module
ZPublisher.pubevents
.
When an exception is raised, a view registered for the
exception type as context (and a generic request) named
index.html
will be rendered as an error message, if it exists.
Traversal¶
If an object has a method
__bobo_traverse__(self,
request,
name)
, this will be used during traversal in lieu of attribute
or item access. It is expected to return the next item to
traverse to given the path segment
name
. A more modern approach is to register an adapter to
IPublishTraverse
although this only applies to publication (URL) traversal,
not path traversal.
The method
__before_publishing_traverse__(self,
object,
request)
can be implemented to be notified when traversal first
finds an object. Implemented on a class, the
self
and
object
parameters will be the same.
See also the
SiteAccess
package, which implements a through-the-web manageable,
generic multi-hook to let any callable be invoked before
access through an "AccessRule".
The event
zope.traversing.interfaces.IBeforeTraverseEvent
is notified when traversing over something that is a local
component site, e.g. the Plone site root.
The
__browser_default__
method can be implemented to specify a "default
page" (akin to an
index.html
in a folder). A more modern way to do this is to register
an adapter to
IBrowserPublisher
.
An adapter to
ITraversable
can be used to implement namespace traversal (.../++<namespace>++name/...
). See above for further details.