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

Peter Sabaini peter at sabaini.at
Wed May 30 12:51:18 EDT 2007


On Wed 2007-05-30 17:14:13 Tres Seaver wrote:
> 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.

Ah, I see. I thought component.adaptedBy() checked the actual registration... 

> Does adding the following help?
>
>   >>> from zope.component import provideAdapter
>   >>> provideAdapter(ClientID)

Nope, I still get the "Could not adapt ... " error.

Besides, zope/app/session/configure.zcml has the following:

  <adapter
      factory=".session.ClientId"
      permission="zope.Public" 
      />

and ClientId has:

    class ClientId(str):
        implements(IClientId)
        adapts(IRequest)

Does that take care of registration?

I wonder if I need to do some special Five incantation to make the global 
registration work?

This, on the other hand, works quite well (lifted from some unit tests):

    >>> from cStringIO import StringIO
    >>> from zope.app.testing import ztapi, placelesssetup
    >>> from zope.app.session.interfaces import IClientId, IClientIdManager
    >>> from zope.app.session.session import ClientId
    >>> from zope.app.session.http import CookieClientIdManager
    >>> from zope.publisher.interfaces import IRequest
    >>> from zope.publisher.http import HTTPRequest
    >>>
    >>> placelesssetup.setUp()
    >>> ztapi.provideAdapter(IRequest, IClientId, ClientId)
    >>> ztapi.provideUtility(IClientIdManager, CookieClientIdManager())
    >>> request = HTTPRequest(StringIO(), {}, None)
    >>> IClientId(request)
    'WiKfis240zXEVZ0UWM6H6AsWc6kYwJyviHNXhGqd835xsnZhKlzfjc'

The difference: zope.publisher.http.HTTPRequest is a new-style class (is that 
required?), and placelesssetup.setUp() is executed (what does it do?)

> 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.

I'm afraid I'm not sure what I should be looking for...

Thanks a lot,
peter.

>
> Tres.




More information about the Zope mailing list