[Zope] Re: Five: Adapter registry not working?

Tres Seaver tseaver at palladion.com
Wed May 30 11:14:13 EDT 2007


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Peter Sabaini wrote:
> Hi list,
> 
> I am clearly doing something wrong here.
> 
> I try to use an Adapter from zope.app.session with an HTTPRequest object, but 
> the Adapterregistry doesnt quite cooperate.
> 
> Specifically, I try to adapt a HTTPRequest object to 
> zope.app.session.interfaces.IClientId via the Adapter 
> zope.app.session.session.ClientId
> 
> A short demo:
> 
>     % ./zopectl debug
>      [ ... ]
> 
> Import stuff:
> 
>     >>> from ZPublisher.HTTPRequest import *
>     >>> from StringIO import StringIO
>     >>> from zope.app.session.session import ClientId
>     >>> from zope.app.session.interfaces import IClientId
>     >>> from zope import component
>     >>> from zope.interface import *
> 
> Create ourselves a faux request object:
> 
>     >>> env = {'SERVER_NAME': '', 'SERVER_PORT' : ''}
>     >>> request = HTTPRequest(StringIO(), env, None)
> 
> ClientId implements IClientId:
> 
>     >>> list(implementedBy(ClientId))
>     [<InterfaceClass zope.app.session.interfaces.IClientId>]
> 
> It seems ClientId is an Adapter for IRequest:
> 
>     >>> component.adaptedBy(ClientId)
>     (<InterfaceClass zope.publisher.interfaces.IRequest>,)
> 
> request implements IBrowserRequest, which is a subclass of IRequest:
> 
>     >>> list(providedBy(request))
>     [<InterfaceClass zope.publisher.interfaces.browser.IBrowserRequest>]
>     >>> issubclass(list(providedBy(request))[0], component.adaptedBy(ClientId)
> [0])
>     True
> 
> ...so I'd expect to get ClientId as an Adapter for IClientId(request), but I 
> dont:
> 
>     >>> IClientId(request)
>     Traceback (most recent call last):
>       File "<stdin>", line 1, in ?
>     TypeError: ('Could not adapt', <HTTPRequest, URL=http://:>, 
> <InterfaceClass zope.app.session.interfaces.IClientId>)
> 
> 
> Shouldnt this work? Obviously I am missing something here.
> This is on Zope 2.10.2 with the built-in Five, and Python 2.4.4
> 
> Any help greatly appreciated!

You have verified that 'ClientID' is a suitable candidate for adapting
'IRequest' to 'IClientID', but not that it has been actually registered
as the factory for that adaptaion.

Does adding the following help?

  >>> from zope.component import provideAdapter
  >>> provideAdapter(ClientID)

Also, at the point where the lookup fails, you can try:

  >>> import pdb; pdb.pm()

and be in a "postmortem" traceback of the failed component tookup.


Tres.
- --
===================================================================
Tres Seaver          +1 540-429-0999          tseaver at palladion.com
Palladion Software   "Excellence by Design"    http://palladion.com
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFGXZTF+gerLs4ltQ4RAvLzAJ0UR0/wFghBJK0YcgtGJjdodTBUzwCfdBG/
J0+AFzw3+yGrOgjSQVpzkyw=
=xa7i
-----END PGP SIGNATURE-----



More information about the Zope mailing list