Exposing a the simple publisher (Re: [Zope-dev] Re: Reducing
dependencies of zope.publisher)
Jim Fulton
jim at zope.com
Tue Mar 25 09:19:49 EDT 2008
On Mar 25, 2008, at 5:25 AM, Martijn Faassen wrote:
> Jim Fulton wrote:
> [snip]
>> Thoughts? Objections?
>
> A simpler publisher has been on my wish-list for a long time now.
>
> I'm a bit worried though that a publisher born from the current Zope
> 3 publisher with the goal to build up enough support for the Zope 3
> publisher to make use of the code will not in fact be simpler. The
> current Zope 3 publisher supports quite a few pluggability points
> (though not necessarily always in the most convenient places), and
> has a lot of interacting components, which makes it rather hard to
> comprehend sometimes.
I suspect you are confusing, as the repoze folks seem to have, the
publisher, with the way that the Zope 3 server set up code wires it
up. When we originally set up zope.server at the dawn of Zope 3, we
inadvertently created a gordian knot of interacting components. When
we added WSGI and Twisted support, we just made this worse by adding
additional threads.
The basic publisher framework is pretty straightforward. There is a
generic publisher and a publication component that takes care of
customizing the publisher for a particular application. The
publication interface, zope.publisher.interfaces.IPublication, defines
the available hooks. The recent addition of zope.publisher.paste makes
selection of a custom publisher much simpler -- as well as supplying
paste support. Unfortunately, I don't think anyone has paid attention
to this. :(
If all you want is more control over how the publisher works, I think
the current publisher simplified via the new paste support should meet
your needs. It's possible some folks need more hooks, but then we
should focus on evolving the publication API,
zope.publisher.interfaces.IPublication.
> You seem to be confident you can create this simplicity while
> retaining enough pluggability to build the Zope 3 publisher back up
> on it, though, correct?
Yup. In fact, all I'm planning to do is to move most of the existing
publisher code to a separate package sans interface declarations,
xmlrpc, and a few other things that many applications don't need. I
intend to keep the current publisher+publication framework. I don't
expect to rewrite any code, other than tests, or change any
semantics. In fact, I'd like migration from the leaner pubisher to
the full publisher to be as easy as in import change.
> I'd be interested in using such a publisher as the foundation for
> the publisher in Grok.
Why? (But read to the end before answering. :)
> Of course Grok does currently use the current Zope 3 publisher in
> Zope 3, and uses quite a bit of functionality in it (XML-RPC,
> skinning, and some hackery to build up the REST support). Getting
> away from the current publisher won't be trivial.
Then why do it? (ditto)
> We couldn't make do with just the new publisher, but perhaps the new
> publisher + extensions will be simpler to comprehend still than the
> old publisher.
I encourage you to study zope.publisher.paste. I content that the
publisher itself isn't that complicated.
> Note a few issues I had with the current publisher that might be
> resolved in a new one:
>
> REST support cannot be distinguished reliably
I don't know what you mean by REST support. Could you briefly explain?
> with a header (like I believe XML-RPC can). It needs to work in a
> proper browser. This means that REST support (low-level handlers for
> GET, POST, PUT, etc) needs to be mixed in an interesting way with
> the browser publisher. For PUT and DELETE this is not a problem, as
> the browser normally doesn't issue them. With POST and GET, the only
> distinction you can make from normal browser behavior is actually
> what URL is being used in the first place, and thus what view you're
> trying to get. In Grok's REST support I used a different skin to
> indicate this different kind of view. This required some hackery to
> support. It'd be nice if there were a cleaner way to pass GET and
> POST requests into separate handlers based on, say, the skin you're
> in. Perhaps Stephan Richter's rest package can do this; I haven't
> examined it yet.
I don't really know what you are talking about. I'll make a few notes
that may be responsive, or simply argumentative. :)
- I hate skins. They cause me only pain. They cause lots of subtle
complexity. I acknowledge that they provide some benefits but I don't
think the benefits are worth the cost. IMO, the problems that they
solve can be solved in less magic ways. Note that skins are not
intrinsic to the publisher. They were imposed on the publisher in the
complicated request-factory dance.
- I think the current mechanisms for dealing with XML-RPC was a
mistake. It's waaay too complicated. The whole request-factory dance
contributed to the complexity of the publisher configuration.
- I fixed a bug in the publisher over the weekend that may have
contributed to your REST woes (whatever those are:). I've been doing
lots of ajax (sans xml :) lately. Following standard ExtJS practice,
I've been making requests as form data and getting JSON responses. I
wanted my requests to be JSON too and found that POST requests were
swallowing non-form/non-multi-part bodies. Now in zope.publisher.
3.5.1, these bodies are left intact.
- To deal with AJAX requests, rather than changing the request setup
logic to introduce a new request factory , I've localized the
specialized behavior in descriptors (exposed as decorators). I use
simple views that return pages that load JS applications. These JS
applications make ajax calls to sub-urls of the original pages. In my
view classes, I then have simple ajax methods that take and return
Python data. Something like:
@zc.extjs.application.jsonpage
def add(self, value):
if not isinstance(value, int):
return dict(error="The value must be an integer!")
return self.do_add(value)
I'll be releasing this code with documentation in a week or two. I
don't bring this up to plug my work, but merely to point out that
there are simpler and. more importantly, more localized ways to
approach protocols layered on HTTP.
> Security proxies: this topic may not be directly publisher related,
It's not.
> but maybe it is.
Nope. :)
> Somewhere quite low in the request handling of Zope 3 a security
> proxy is introduced around the objects being traversed.
This is done by the default Zope 3 publication object,
zope.app.publication.zopepublication.ZopePublication.
> Grok doesn't want security proxies, so rips them off again in a
> custom publisher. It'd be nice if there were a hook point that would
> enable us not introducing this proxy in the first place.
There always has been, as I've mentioned many times. The same hook
point allows use of Zope 3 without ZODB. These policies are provided
by the publication object. It's a shame that the convoluted setup
system made this so inaccessible.
My hope is that zope.publisher.paste makes it *much* easier to use a
different publications and thus a different set of policies. (I plan
to update zc.zope3recipes to provide an instance recipe pased on paste.)
I'm 99% sure that most or all of the simplicity to want has already
been there for a long time or is there now with the simpler setup
framework in zope.publisher.paste.
Note that my proposal wasn't to simplify the publisher. I think it
already is pretty simple and I hope the recent zope.publisher.paste
work exposes the simplicity by stripping off layers of overly complex
setup. My proposal was simply to extract some core functionality in a
way that greatly reduces dependencies. I don't expect this stripped
down version to be of interest to most of the zope community. I do
think it might be useful to people with much more limited needs. I
didn't the proposal because I thought it would be of general interest,
but to ask permission. I want to do this refactoring, to avoid a (yet
another) fork of the publisher. I should have made this clearer.
Jim
--
Jim Fulton
Zope Corporation
More information about the Zope-Dev
mailing list