[Grok-dev] Grok's update/render pattern

Graham Stratton gns24 at mythic-beasts.com
Mon Jul 14 02:20:35 EDT 2008


Sorry to bring this up again, but it's causing me confusion.

Grok defines the way that the update/render pattern works differently  
from zope.contentprovider.  The contentprovider API states that the  
update method is used only to update the underlying objects based on  
the request, whereas the render method does everything to do with  
rendering.

In grok, the update method is used to set attributes on the view to be  
used in templates, and would perhaps be better named 'prepare'. This  
is fundamentally different, and rather confusing. This is especially  
so for people using viewlets with grok, where the API inherits from  
zope.contentprovider.

This would be a real issue if the content provider API actually  
worked, which sadly it doesn't if you render content providers using  
the TAL provider: directive. I've been thinking about how to make  
proper use of the content provider API, but I think there would need  
to be some pretty fundamental changes somewhere. (In order to update  
every content provider without rendering any of them, you'd probably  
need to update every content provider registered for the current  
(context,request,view), regardless of whether it would actually be  
rendered, which might lead to *really* obscure bugs).

The motivation for zope.contentprovider's separate update/render  
process is that any page component may want to update the underlying  
objects based on a request, and any other page component might render  
differently depending on that update. If after every change to the  
application data a redirect is made, then this largely removes the  
problem, although it might be considered wasteful to render parts of  
the page when other parts are going to abandon the request with a  
redirect anyway. However, I think this is considered best practice at  
the moment. I'm not sure whether this would ever fail. I can probably  
construct a situation where a GET request would update a list of  
what's been viewed, in which case being able to utilise  
zope.contentprovider's API would be nice.

I have been a little sloppy here, as I'm mixing two issues:

- The difference between the two update/render APIs
- The inadequacy of the zope.contentprovider API with Zope as it is  
generally used

I'd be very interested to hear what other people are thinking about  
this. I've found viewlets to be very clean and useful, but this issue  
is making me feel uncomfortable with them, and certainly with trying  
to promote their use.

Many thanks,

Graham


More information about the Grok-dev mailing list