[Twisted-Python] timeout using LivePage

Sean Gillies sgillies at frii.com
Mon Aug 25 16:30:30 EDT 2003


Hi,

Am very new to Twisted but am quickly finding that I like
it.  All my questions and comments involve Twisted 1.0.6
in combo with Python 2.3 on OS X.

I've run into a problem while making a rough .rpy prototype of
a mapping application (ala MapQuest) using the U of Minnesota
MapServer's Python interface.

I will need to have server-side handlers for javascript events
to allow map zooming, panning, &c and so have been experimenting
with LivePage.  I intend that the code should render a map image,
and upon clicking the image, we zoom into the map (changing model
data), and redraw the map image.  Unfortunately, browsers are
unable to load the

mapserv.rpy/?woven_hookupOutputConduitToThisFrame=1

URL that is generated by my instance of LivePage, and so the map
is never redrawn as it should.  The model data does get changed
successfully, and when I manually reload the page, I do see
the zoomed map image as I expect.

What is this 'woven_hookupOutputConduitToThisFrame' all about?
Do I need to set up another method to handle this URL?

I know that it's not recommended to put so much logic in the .rpy
file, but as I said, a quick and dirty prototype is what I'm after.
Am attaching the source of mapserv.rpy here:

--------------------------------------------------------------------
import os
import time
from twisted.web.woven import page, widgets, controller, model
from mapscript import *

base_mapfile = 'navtech_std.map'

# Get map object from the session data if we can
class MapModel(model.MethodModel):
     def wmfactory_mapobj(self, request):
         session_obj = request.getSession()
         try:
             session_mapobj = session_obj.mapobj
         except AttributeError:
             session_mapobj = mapObj(base_mapfile)
             session_obj.mapobj = session_mapobj
         return session_mapobj

# Widget for creating a temp map image and a tag linking to it
class MapImage(widgets.Widget):
     def setUp(self, request, node, data):
         mapobj = data
         node.tagName = "img"
         imgobj = mapobj.draw()
         tmp_file = '%s_%d_%d.%s' \
                  % (mapobj.name, time.time(), os.getpid(),
                     imgobj.format.extension )
         imgobj.save(os.path.join('/tmp', tmp_file))
         map_url = os.path.join('/tmp', tmp_file)
         node.setAttribute('src', map_url)
         node.setAttribute('height', str(mapobj.height))
         node.setAttribute('width', str(mapobj.width))
         node.setAttribute('border', '1')

# Widget for displaying the current scale of the map
class MapScale(widgets.Widget):
     def setUp(self, request, node, data):
         text = 'Scale: 1:%d' % (data.scale)
         newNode = request.d.createTextNode(text)
         node.appendChild(newNode)

# Template, using the web conduit glue
template = """<html>
   <body>
     <img model="mapobj" view="map_image" controller="map_ctrl"/>
     <p model="mapobj" view="map_scale" />
     <div view="webConduitGlue" />
   </body>
</html>
"""

# Zoom into the map in the event of a javascript onclick
class MyEventHandler(controller.Controller):
     def handle(self, request):
         self.view.addEventHandler("onclick", self.onClick)

     def onClick(self, request, widget):
         # Get session map object (layers and spatial extents)
         session_obj = request.getSession()
         try:
             session_mapobj = session_obj.mapobj
         except AttributeError:
             session_mapobj = mapObj(base_mapfile)
             session_obj.mapobj = session_mapob

         # zoom in on the map
         w = session_mapobj.width
         h = session_mapobj.height
         pt = pointObj()
         pt.x, pt.y = w/2, h/2
         session_mapobj.zoomPoint(2, pt, w, h, session_mapobj.extent, 
None)
         print session_mapobj.extent.minx, session_mapobj.extent.maxx
         print self, "Zoomed!!!"

         # There is a better way to redraw the map, certainly
         request.redirect('http://localhost:8084/mapserv.rpy/')
         request.finish()

# Page class
class MyPage(page.LivePage):
     def wcfactory_map_ctrl(self, request, node, model):
         return MyEventHandler(model)

# Resource
resource = MyPage(MapModel(), template=template)
resource.setSubviewFactory("map_image", MapImage)
resource.setSubviewFactory("map_scale", MapScale)
-----------------------------------------------------------------------

looking forward to any insights into LivePage and also looking forward
to getting enough experience with Twisted that I can begin to contribute
to the list discussions.

cheers,
Sean

--
Sean Gillies
sgillies at frii dot com
http://www.frii.com/~sgillies





More information about the Twisted-Python mailing list