[Zope3-dev] Re: revisiting IResult (for in-Zope pipelining)

Gary Poster gary at zope.com
Mon Apr 16 12:53:26 EDT 2007


On Apr 16, 2007, at 12:18 PM, Philipp von Weitershausen wrote:

> Gary Poster wrote:
>> The work that Jim Washington and David Pratt have started recently  
>> to make lxml an XHTML generator/ZPT replacement [#1]_ has really  
>> excited me.  It would be *great* with in-Zope pipelines [#2]_.
> [snip]
>> So, as a strawman, I propose that we make a public interface in  
>> zope.publisher called IResult:
>> class IResult(zope.interface.Interface):
>>     """An iterable that provides the body data of the response.
>>         For simplicity, an adapter to this interface may in fact  
>> return
>>         any iterable, without needing to strictly have the iterable
>>         provide IResult."""
>
> +1

cool

> I'm particularly fond of making this official because we've been  
> thinking about how to do skinning in Grok in way that's not  
> specific to a templating engine. Being able to return XML tree  
> datastructures (or really any object) from views would allow us to  
> effectively do the theming (transformation of XML trees) in the  
> IResult adapter (before doing the serialization).

yup, precisely

>> (I don't define __iter__ explicitly since I've been reminded too  
>> many times that __getitem__ is still a workable iteration protocol.)
>
> It's workable, but all elementary types that are iterable support  
> __iter__. I see no reason why we shouldn't require it here.

Yes, I'll specify __iter__.

> (M-x replace-string RET IRequest RET IResult RET)

Oh, you emacs guys. ;-).  Yup.

>> Then we look up the IRequest using the same multiadaptation of  
>> (result, request) we have now, which makes it possible to set  
>> headers in the adapter if desired.
>> An IResult adapter could then be as simple as this:
>> @zope.interface.implementer(zope.publisher.interfaces.http.IResult)
>> @zope.component.adapter(
>>     SomeCoolLXMLThing,
>>     zope.pubisher.interfaces.browser.IBrowserRequest)
>> def postprocessLXML(lxml, request):
>>     do_some_cool_transformation(lxml)
>>     return output_to_html(lxml)
>> and it might do a bit of request.response.setHeader(...) calls  
>> too, if appropriate.
>> We would delete the private IRequest entirely, without deprecation  
>> (I argue that the warning in the doc string is pretty supportive  
>> of this).
>
> +0
>
>> .. [#2] I want views to be able to return lxml structures, and  
>> widgets to be able to return lxml structures.  I want the  
>> publisher to have a pipeline to be able to transform the output of  
>> a view with o-wrap, and zc.resourcelibrary-like postprocessing  
>> done right.  I want pages to be able to cache their lxml output,  
>> while then an o-wrap gets personalized/more timely bits for the o- 
>> wrap.  And so on.
>
> And Grok wants the theming as part of the pipeline :). I supposed  
> it's something like zc.resourcelibrary on steroids.

:-)

> Btw, interesting that you bring up zc.resourcelibrary as an  
> example. Ian Bicking recently blogged about doing post-rendering  
> transformations to insert JavaScript [1]. He specifically talks  
> about a form context (widgets needing JavaScript).
>
> [1] http://blog.ianbicking.org/lxml-transformations.html

Yes, I saw that too.  I wonder if he does dependency stuff, as  
zc.resourcelibrary does now; I find that quite nice, and will still  
want it even when the majority of the package's code can evaporate  
because of IResult.

Gary


More information about the Zope3-dev mailing list