
1) The cached branch on top of svn trunk generates an exception in CachedSerializer, unfortunately I didn't save the exception. Since I don't strictly need the tags.cached, I left only the rend.Page cache below in my tree: Index: Nevow/nevow/rend.py =================================================================== --- Nevow/nevow/rend.py (revision 1334) +++ Nevow/nevow/rend.py (working copy) @@ -30,6 +30,7 @@ from nevow import flat from nevow.util import log from nevow import util +from nevow import url import formless from formless import iformless @@ -381,6 +382,8 @@ self.children[name] = child +_CACHE = {} + class Page(Fragment, ConfigurableFactory, ChildLookupMixin): """A page is the main Nevow resource and renders a document loaded via the document factory (docFactory). @@ -394,8 +397,37 @@ afterRender = None addSlash = None + cache = False + lifetime = -1 + __lastCacheRendering = 0 + flattenFactory = lambda self, *args: flat.flattenFactory(*args) + def hasCache(self, ctx): + if not self.cache: + return + + _now = now() # run gettimeofday only once + timeout = _now > self.__lastCacheRendering + self.lifetime and \ + self.lifetime >= 0 + c = self.lookupCache(ctx) + if timeout or c is None: + # stop other renders + self.__lastCacheRendering = _now + c = None + return c + def cacheRendered(self, ctx, c): + if not self.cache: + return + # overwrite the deferred with the data + self.storeCache(ctx, c) + def cacheIDX(self, ctx): + return str(url.URL.fromContext(ctx)) + def storeCache(self, ctx, c): + _CACHE[self.cacheIDX(ctx)] = c + def lookupCache(self, ctx): + return _CACHE.get(self.cacheIDX(ctx)) + def renderHTTP(self, ctx): if self.beforeRender is not None: return util.maybeDeferred(self.beforeRender,ctx).addCallback( @@ -421,11 +453,18 @@ if self.afterRender is not None: return util.maybeDeferred(self.afterRender,ctx) - if self.buffered: + c = self.hasCache(ctx) + if c is not None: + finishRequest() + return c + + if self.buffered or self.cache: io = StringIO() writer = io.write def finisher(result): - request.write(io.getvalue()) + c = io.getvalue() + self.cacheRendered(ctx, c) + request.write(c) return util.maybeDeferred(finishRequest).addCallback(lambda r: result) else: writer = request.write @@ -507,7 +546,6 @@ else: ## Use the redirectAfterPost url ref = str(redirectAfterPost) - from nevow import url refpath = url.URL.fromString(ref) magicCookie = '%s%s%s' % (now(),request.getClientIP(),random.random()) refpath = refpath.replace('_nevow_carryover_', magicCookie) 2) self.locateConfigurable returns a deferred, so I changed my code to get the retval via addCallback, so this is fine. 3) The renderForms has changed layout with <legend>. You can see the layout of the new code (already online) here https://www.cpushare.com/verify_email/. Now I don't dislike this change but I would like to keep the legend at the center of the page (not on the left), is that possible with some css tweak? I tried to do that in the fieldset but that screwed the alignment of everything else too. I only want the legend to be centered instead. Hints? Thanks and keep up the great work.
participants (1)
-
Andrea Arcangeli