[Twisted-web] nevow/stan + pregenerated HTML

Mike Warren spam at mike-warren.com
Wed Jun 2 16:59:11 MDT 2004


Mike Warren <spam at mike-warren.com> writes:

> Is there any way to do this? Ideas?

Of course, I got an idea right after I sent this. But, I think I might
have found a bug in Nevow (although I'm pretty new at this; *please*
correct me if I'm wrong).

I figured I could make my own class implementing
nevow.inevow.ISerializable and skip the whole "quoting" phase
altogether. I did this:

,----
| class RawString(str):
|     __implements__ = nevow.inevow.ISerializable
|     
|     def serialize(self, context):
|         return str(self)
`----

...however, in nevow/flat/ten.py:

,----
| # FIXME: hack!
| # and the way serialize is implemented is possibly an
| # abuse of the compy system, but hey, it WORKS. :)
| 
| cachedAdapters = {}
| def getSerializer(obj):
|     if hasattr(obj, '__class__'):
|         klas = obj.__class__
|     else:
|         klas = type(obj)
| 
|     adapter = cachedAdapters.get(klas, None)
|     if adapter is not None:
|         return adapter
|     
|     #print "Adding cache entry for ",klas
|     registry = compy.getRegistry(None)
|     fromInterfaces = compy.classToInterfaces(klas)
|     for fromInterface in fromInterfaces:
|         #print " trying: ", fromInterface
|         adapter = registry.getAdapterFactory(
|             fromInterface,
|             inevow.ISerializable,
|             None)
|         if adapter is not None:
|             cachedAdapters[klas] = adapter
|             return adapter
|     return None
`----

...it appears that this code presumes that one needs an adaptor to the
ISerializable interface. My object already implements this, however,
so I added these two lines (after the " trying:" print statement):

,----
|         if fromInterface == inevow.ISerializable:      
|             return lambda object,x: object.serialize(x)
`----

...which makes everything do exactly what I want (namely, in my
original code, I return a RawString for my pregenerated HTML and it
makes it through fine). [Of course, I realise I might end up with
non-conforming XHTML if I fuck up my pregeneration, but hey...]

Am I right? Should I file a patch? (After adding code to cache the
lambda, too)

Cheers,

-- 
mike [at] mike [dash] warren [dot] com
<URL:http://www.mike-warren.com>
gpg --keyserver 80.71.227.37 --recv-key 579911BD
87F2 4D98 BDB0 0E90 EE2A 0CF9 1087 0884 5799 11BD



More information about the Twisted-web mailing list