[Zope] External method and stdout

Kapil Thangavelu kthangavelu@earthlink.net
Tue, 05 Sep 2000 11:13:03 -0700

Andreas Pauley wrote:
> For some reason you have to "return" everything that should be available
> to zope. You can return a sequence and loop through it with DTML or you
> can build a variable with everything you want to display and then return
> the variable.
> I have no idea why this is so, and why you can't just the print
> statement as an equivalent to <dtml-var>.
> There is probably elegant ways of replacing DTML with external methods
> or Python Methods, I was just unable to find documentation and examples
> on it until now. Can anyone help with this?
> Regards,
> Andreas.

there are a couple of ways. first zope's publishing objects. if your
publishing a dtml method object than the semantics of it require that
values be inserted into the template/page thats being returned to the
user. you can also publish an external method or a python module
directly(indeed Zope is just a published python module). but sticking to
zope external methods, an example, if you had

def myhello_world(self, REQUEST):

	page = " welcome to %s corner of my hello world

and just browse directly to the external method. its important to keep
in mind that stdout isn't connected to the client. the client is
connected to medusa/ZServer, which gives a channel to ZPublisher to
publish data that will be returned to the client. this mainly applies to
fs code, i'm not totally sure about the semantics of web python
methods.  i know this probably goes a bit further down the rabbit hole
than you might be interested in going. if you want to know some more of
the details. 

check out the medusa docs at

and the ZPublisher docs under the Documentation Sec. of Zope.org. 
These are dated but they give a understanding of the interaction between
medusa's asynch interfaces and zope.

and of course the source code.

you could also use document templates directly from python

def new_world_order(self, REQUEST):
	from DocumentTemplate import HTML

	my_sites = [('My homepage','http://homepage'), 
		    ('my favorite bookstore','http://amazon.com')
		, ... etc]

	page_to_return = """

	<dtml-in sites>
	<li><a href="<dtml-var sequence-item>"><dtml-var sequence-key></a></li>



	return HTML(my_sites)(sites=my_sites)

or evaluate a dtml file on the file system using HTMLFILE

see the DocumentTemplate directory for source and more examples

D.Templates also give you a pretty good separation of app. logic and
presentation. Doing straight python insertion in a page is not the Zope
Way. if you're interested in this type of thing, you might want to check
out some other python projects like mod_snake (apache),
pywx.sourceforge.net (aolserver), or webware. I'll think you find the
benefits of doing it through DTML offer you a lot more benefits in terms
on maintainbility and site management.



> > Sven Hohage wrote:
> >
> > Hallo,
> > that's the problem:
> > I've made an external method which is working with lists and should
> > return the result to Zope. The python code is working very well, but
> > is sending everything to sys.stdout( I'm using the
> > print-statement).How do I convince  Zope to print the result on the
> > html-page.
> >    Thanks.
> --
> In a world without fences, who needs gates?
> _______________________________________________
> Zope maillist  -  Zope@zope.org
> http://lists.zope.org/mailman/listinfo/zope
> **   No cross posts or HTML encoding!  **
> (Related lists -
>  http://lists.zope.org/mailman/listinfo/zope-announce
>  http://lists.zope.org/mailman/listinfo/zope-dev )