Some days ago I ran into the same problem, and have been pointed to this thread. Maybe you are interested in my solution. It's ugly, but I needed it for a test-case, where I wanted to access "@@plone_context_state/is_view_template": >>> from ZPublisher.HTTPRequest import HTTPRequest >>> from ZPublisher.HTTPResponse import HTTPResponse >>> from Products.PloneTestCase import PloneTestCase >>> import base64 >>> user_id = PloneTestCase.default_user >>> password = PloneTestCase.default_password >>> encoded = base64.encodestring( '%s:%s' % ( user_id, password ) ) >>> auth_header = 'basic %s' % encoded >>> resp = HTTPResponse() >>> env={'SERVER_URL':'http://nohost/plone', ... 'URL':'http://nohost/plone', ... 'HTTP_AUTHORIZATION': auth_header, ... 'REQUEST_METHOD': 'GET', ... 'steps': [], ... '_hacked_path': 0, ... '_test_counter': 0, ... } >>> request = HTTPRequest(stdin=None, environ=env, response=resp) >>> request['PARENTS'] = [self.getPortal()] >>> contextState = request.traverse("weblog/issue193/" ... "@@plone_context_state") >>> request['ACTUAL_URL'] = 'http://nohost/weblog/issue193' >>> contextState.is_view_template() True >>> request.close() Grüße Jan Hackel Martin Aspeli wrote:
There's currently a funny inconsistency in Zope's Traversable class. If you have a URL like http://localhost:8080/path/to/@@aview/foo, and @@aview implements IPublishTraverse (and, I presume, if there's a custom IPublishTraverse adapter for any other path component), URL traversal will work fine, but calling to.restrictedTraverse('@@aview/foo') or some variant thereof will fail, because (un)restrictedTraverse() does not respect custom IPublishTraverse adapters.