PyAMS namespace traverser¶
+PyAMS_utils provide a custom URL traverser, defined in package pyams_utils.traversing
.
The NamespaceTraverser
is a custom traverser based on default
+Pyramid’s ResourceTreeAdapter, but it adds the ability to use namespaces. Inherited from Zope3 concept, a
+namespace is a resource path element starting with the « ++ » characters, like this:
http://localhost:5432/folder/content/++ns++argument/@@view.html
+
In this sample, ns is the namespace name. When the traverser detects a namespace, it looks for several named
+adapters (or multi-adapters) to the ITraversable
interface
+defined in zope.traversing package. Adapters lookup with name ns is done for the current context and request,
+then only for the context and finally for the request, in this order. If a traversing adapter is found, it’s
+traverse()
method is called, with the attr value as first argument, and the rest of the traversal stack
+as second one.
This is for example how a custom etc namespace traverser is defined:
+from pyams_utils.interfaces.site import ISiteRoot
+from zope.traversing.interfaces import ITraversable
+
+from pyams_utils.adapter import adapter_config, ContextAdapter
+
+@adapter_config(name='etc', context=ISiteRoot, provides=ITraversable)
+class SiteRootEtcTraverser(ContextAdapter):
+ """Site root ++etc++ namespace traverser"""
+
+ def traverse(self, name, furtherpath=None):
+ if name == 'site':
+ return self.context.getSiteManager()
+ raise NotFound
+
By using an URL like ‘++etc++site’ on your site root, you can then get access to your local site manager.
+argument is not mandatory for the namespace traverser. If it is not provided, the traverse method is called with +an empty string (with is a default adapter name) as first argument.
+Several PyAMS components use custom traversal adapters. For example, getting thumbnails from an image is done +through a traversing adapter, which results in nicer URLs than when using classic URLs with arguments...
+