[Twisted-web] fragments with child lookup

Markus Schiltknecht markus at bluegap.ch
Fri Sep 22 02:32:47 CDT 2006


Hi,

I've now solved my problem, sort of. I'm still wondering, if there is a 
more elegant solution, probably integrated into nevow. Since, IMHO, this 
is one of the use-cases of a template system.

I did more or less the following (simplified, naming could be improved, 
too):


class Container(rend.Page):
	addSlash = True

	def __init__(self, source):
		self.source = source
		self.docFactory = self.source.getFactory();

	def locateChild(self, ctx, segments):
		""" Loads sub-pages (fragments?) for all the remaining
		    segments. It does its own lookup with the
		    childFragmentLookup() method.
		    All children are then added to the slot 'children'
		    in reversed ordering, so I can simply pop()
		"""
		children = []

		child = self
		while len(segments) > 0:
			if segments[0] != '':
				child = child.childFragmentFactory(segments[0])
				if child is None:
					return appserver.NotFound

				children.append(child)

			segments = segments[1:]

		children.reverse()
		ctx.fillSlots('children', children)
		curr_counter = len(children)
		return self, ()

	def childFragmentFactory(self, name):
		""" Tries to create a child for a given name. May return
		    None! (This should probably better raise an
		    exception, no?)
		"""
		child_source = self.source.getChild(name)
		if child_source is not None:
			return Container(child_source)

	def render_content(self, ctx, data):
		""" every fragment may have a 'content' renderer, where
		    it's child fragment should be included. This looks
		    up the next child and returns it for rendering.
		"""
		children = ctx.locateSlotData('children')
		if len(children) > 0:
			child = children.pop()
			curr_counter = len(children)
			return child
		else:
			raise Exception("content renderer called too many times!")



The children have to be stored in the context. I've also tried returning 
  the child in the Container.locateChild() method, and then hook the 
renderHTTP() method to render the parents first. But I've had no luck 
with fetching the parents from the context (and it's parent contexts). I 
would prefer that, because I wouldn't have to write my own childLookup() 
method.

Thoughts? Comments?

Regards

Markus



More information about the Twisted-web mailing list