Can someone give me a pointer to what these helper classes actually do? Can I use them to setup lists and dictionaries that will be used over the lifetime of the Zope server? This is an example from an external method that Pavlos posted a while back. class MCQ: ''' helper class for MCQ system''' def __init__(self, score): ''' constructor''' self.score = 0 self.total_score = 0 What I would like to do is load up a template_lookups dictionary with quite a few entries; for template_id in self.Actors.RENDER.objectIds(): renderer = eval("self.Actors.RENDER.%s" % template_id) template_lookups[template_id] = renderer Thing is, I need access to the ZODB in one of my methods later in the module and so the above code doesn't work (too many 'selfs'!). Anyone got any ideas? tone. ------ Dr Tony McDonald, FMCC, Networked Learning Environments Project http://nle.ncl.ac.uk/ The Medical School, Newcastle University Tel: +44 191 222 5888 Fingerprint: 3450 876D FA41 B926 D3DD F8C3 F2D0 C3B9 8B38 18A2
On Fri, 3 Mar 2000, Tony McDonald wrote:
This is an example from an external method that Pavlos posted a while back.
class MCQ: ''' helper class for MCQ system''' def __init__(self, score): ''' constructor''' self.score = 0 self.total_score = 0
I think it is not a good idea to define classes in external methods. It is better to define them somewhere in Shared (see the directory DC under lib/python/Shared for example) and import them in your external method. import Shared.Tony.helper They can be very handy especially since python is way more elegant and easy for complex logic in relation to DTML.
What I would like to do is load up a template_lookups dictionary with quite a few entries;
for template_id in self.Actors.RENDER.objectIds(): renderer = eval("self.Actors.RENDER.%s" % template_id) template_lookups[template_id] = renderer
Thing is, I need access to the ZODB in one of my methods later in the module and so the above code doesn't work (too many 'selfs'!).
Anyone got any ideas?
Not sure. need some more info. Did you try to use getattr to get to object? tmp=self.Actors.RENDER renderer=getattr(tmp,template_id) What kind of object is template_id? Pavlos
I think it is not a good idea to define classes in external methods. It is better to define them somewhere in Shared (see the directory DC under lib/python/Shared for example) and import them in your external method.
import Shared.Tony.helper
I've never used the DC Shared folder before. I've had a look in there as you suggest and found some interesting things there. Time to read the docs on this aspect I think...
They can be very handy especially since python is way more elegant and easy for complex logic in relation to DTML.
Definitely. I'm now using the XXX PythonMethods that Evan Simpson contributed and it's *definitely* helping to speed up development time.
What I would like to do is load up a template_lookups dictionary with quite a few entries;
for template_id in self.Actors.RENDER.objectIds(): renderer = eval("self.Actors.RENDER.%s" % template_id) template_lookups[template_id] = renderer
Thing is, I need access to the ZODB in one of my methods later in the module and so the above code doesn't work (too many 'selfs'!).
Anyone got any ideas?
Not sure. need some more info. Did you try to use getattr to get to object?
Sorry, I should be more specific. The above code is in a method - def supercascade(self, tag_id): which is called from Zope with a query_string, tag_id=231441. That code works, but I need to load up the renderers everytime supercascade is called. I'm looking at the helper classes to see if I can't load up the template_lookups array once. Having said that, supercascade isn't called anywhere near the number of times that make_html (the method that generates the HTML for display) is, so it's possible that I'm flogging a dead horse here.
tmp=self.Actors.RENDER renderer=getattr(tmp,template_id)
What kind of object is template_id?
It's a DTML document of the form (this example has id = lecture_info); --- <hr> <p class="<dtml-var class>"><dtml-var content null=" "></p> --- make_html then has a snippet in it so; try: template_str = template_lookups[theclass] template = DocumentTemplate.HTML(template_str) theresult = template(self, content=content, src=src, thetag=thetag, level=level, the class=theclass, header=header) return "<!-- theclass [%s] thetag [%s] -->" % (theclass, thetag) + theresult except: pass which will then render the HTML appropriately. The *really* neat thing is when you have more complex DTML in the template that has ZSQL calls etc. It works well, but I want to speed it up a bit - it can take up to 6 seconds to render a 100k document, and if I've understood my Zope architecture correctly, thats one thread used up (and I'm only using the default thread count - I think it's six) until the request has finished. I'm sure that previous messages on the list have implied that it's not worth changing the number of threads to something like 32-64, but I'm not sure. That's my main problem, people are hitting the site and generating lots of requests that are in the >1 second range. With our Apache servers, we just spawn ludicrous numbers of httpd processes and don't worry about it. Zope is a different kettle of fish and I need to think differently about it.
Pavlos
Many thanks for your help Pavlos, I feel things are a quite a bit clearer now. tone
participants (3)
-
Pavlos Christoforou -
Tony McDonald -
tony mcdonald