I didn't know about zope.publisher.paste, thank you.
I've spent a little bit of time trying to grok zope.publisher.publish
and the IPublication API, and indeed it seems there is almost a one-
for-one mapping between Zope's "publication" and repoze.obob's "helper".
It would almost certainly be possible to use a slimmed-down
zope.publisher to do what repoze.obob/repoze.zope2 does now. But it
would mean:
- Implementing something Zope2-specific that implemented IPublication.
- Implementing a new request type that handled traversal in a Zope2-
ish way, that didn't support retry (as
that's meant to be handled upstream).
But essentially, if somebody was motivated, the code in
Zope2ObobHelper at http://svn.repoze.org/repoze.zope2/trunk/repoze/zope2/z2bob.py
could mostly be cut-n-pasted to allow the Z3 publisher to serve up a
Zope 2 app.
Two nits:
- I don't like the fact that zope.publisher.publish uses the
"setResult" API of the request to handle the result returned by the
published object.. why wouldn't it just return the result? Maybe this
dance was cargo-culted over from Zope2.
- I don't like that the request handles traversal. This also smells
like it was cargo-culted from Z2. Why shouldn't the publication
itself do traversal? Traversal is extremely policy-laden, why break
the code that implements that policy up so that you need "matching"
request and publication objects?
- C
On Mar 25, 2008, at 3:50 PM, Tres Seaver wrote:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Jim Fulton wrote:
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.
I spent a couple of days trying to work out how those bits were
interacting, back before we re-implemented a bobo-like thing as
'repoze.obob'. Its intro doc lays out our goals:
- -------------------------------------------
repoze.obob Overview
This package provides a paste-configurable version of the classic
'bobo' publisher, which maps request URLs to objects via graph
traversal.
It is desgined to be the endpoint ("application") in a WSGI
filter / application pipeline.
The publisher is responsible for:
- converting the WSGI environment into a request object and its
corresponding resopnse object;
- selecting the "root" object of the graph for a given request /
URL;
- traversing from that root object along the "edges" defined by
the URL path elements to find the "published object";
- invoking the published object, mapping any request parameters
onto
its arguments;
- mapping response headers and body, along with the result from
calling the published object, into appropriate WSGI output.
The publisher is *not* responsible for the following tasks, which
belong to WSGI "middleware" components:
- setting up any transaction;
- committing or aborting a transaction;
- retrying failed / conflicting requests;
- converting Python exceptions into HTTP response codes.
- ----------------------------------------
In particular, we wanted to move all those excluded responsibilities
out
into middleware, so that they could be shared across multiple WSGI
applications, including those which were not Zope-specific at all.
We've been successfull at that goal: the Pylons and TurbooGears folks
are working on integrating repoze.tm into their stacks, for instance.
repoze.obob puts all the policy for publishing into a set of plugins
passed in at construction (typically configured via Paste
configuration):
- Initializing anything at startup
- Finding the root object
- Handling the policy-driven bits of the publishing traversal,
calling the published object, and converting the result. This
part is largely like what the publication object does, except
the "find the root object" bits, which we broke out.
We have a re-implementation of the classic Zope2 publisher machinery
(repoze.zope2.z2bob) which suppy these policy implementations.
repoze.kiss, for instance, works by just replacing the "root finder"
part with version which creates a proxy object for a filesystem
directory: the "Zope2ObobHelper" then works fine against that
alternate
root.
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 publication factory dance is completely inscrutable.
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. :(
I haven't looked much into it. I would be happy to have a simpler way
to set up the Zope3 publisher, free of the policy stuff embedded in
the
existing publication objects.
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.
Can we implement a publication which defers error handling /
transaction
handling / retry handling to middleware? The 'repoze.grok' package,
for
instance, works around the error handling bit by adding a WSIG
"ingress"
filter which stuffs a key into the WSGI environment
('wsgi.handleErrors') to get the Zope3 WSGI application to defer error
handling.
Tres.
- --
===================================================================
Tres Seaver +1 540-429-0999 [EMAIL PROTECTED]
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
iD8DBQFH6Vd2+gerLs4ltQ4RAlX9AJ94LIc9s125p6cGsitBXDoN6g0bfwCff7uZ
B8ztzcxpF4hw+qBHXxtxZeE=
=AASc
-----END PGP SIGNATURE-----
_______________________________________________
Zope-Dev maillist - Zope-Dev@zope.org
http://mail.zope.org/mailman/listinfo/zope-dev
** No cross posts or HTML encoding! **
(Related lists -
http://mail.zope.org/mailman/listinfo/zope-announce
http://mail.zope.org/mailman/listinfo/zope )
_______________________________________________
Zope-Dev maillist - Zope-Dev@zope.org
http://mail.zope.org/mailman/listinfo/zope-dev
** No cross posts or HTML encoding! **
(Related lists -
http://mail.zope.org/mailman/listinfo/zope-announce
http://mail.zope.org/mailman/listinfo/zope )