Greetings!

I am using Apache 2.2.25, Mod WSGI 3.3, LXML 3.2.1, and Python 2.7.2

My web site scheme stores web pages as XML documents which are transformed 
into XHTML on-the-fly using XSLT.  Previously I had been using a mod_python 
output filter and I am now trying to update my system to use mod_wsgi.  I 
have converted the mod_python output filter into an equivalent mod_wsgi 
script as shown below.  This script when run outside of mod_wsgi functions 
perfectly.  When it is run inside mod_wsgi it goes into the etree.XSLT() 
method on line 57 and there it hangs up until Apache times out the 
request.  No information is written to the errorlog files.

I have gone through all the known application issues and debugging 
suggestions given on the mod_wsgi wikki to no avail.  Any help at this 
point would be greatly appreciated.



"""

Transform an XML document into an XHTML document

"""

import sys, os, time
from cStringIO import StringIO

sys.path.append('C:/webroot/sites/wsgitest/wsgiscripts')
sys.path.append('C:/webroot/sites/wsgitest/content')
sys.path.append('C:/Python27/lib/site-packages/lxml')

from lxml import etree
from fileutils import *
from nsutils import *

ns = {'pysite': 'http://www.leebrown.org/pysite'}

def paramify (parent, target={}):
    """
    A very quick and dirty objectification function.
    
    Given an arbitrary parent etree element, creates a
    dictionary of {local-name:text} from each child element.
    Also adds necessary embedded quotes to make the dictionary
    suitable to pass as XSLT parameters.
    
    Requires function lname() from module nsutils.py
    """
    for child in parent.getchildren():
        target[lname(child.tag)] = "'%s'" % (child.text)
    return target

def parse_source (streambuffer):
    """
    Converts the source XML held in streambuffer into an lxml Element Tree.
    Source includes are also processed at this time.
    """
    streambuffer.seek(0)
    xml_tree = etree.parse(streambuffer, 
etree.XMLParser(remove_blank_text=True))
    xml_tree.xinclude()
    return xml_tree

def parse_template (xml_tree):
    """
    Attempts to create an XSLT transform object
    from an xml-stylesheet PI in the source tree.

    Returns a None object if no xml-stylesheet PI
    is found; this causes the transform() function below
    to return untransformed XML to the client.
    """
    xsl_pi = xml_tree.getroot().getprevious()
    xsl_tree = xsl_pi.parseXSL()
    if xsl_tree:
        return etree.XSLT(xsl_tree)
    else:
        return None

def get_params (xml_tree):
    """
    If the source XML contains a <page-params> element in the
    target namespace, convert all child elements of this element
    into an XLST parameter dictionary.  Other parameters may be
    added on as desired.
    """
    try:
        params = paramify(xml_tree.xpath('//pysite:page-params', 
namespaces=ns)[0])
    except IndexError:
        params = {}
    return params

def transform (streambuffer):
    """
    This is where most of the fun stuff happens.

    If parse_template() returns a transformer object,
    the source XML tree is transformed, and any
    xincludes added in the transform are then processed.

    If parse template() does not return a tranformer object,
    this function returns the unparsed, untransformed XML source.
    """
    xml_tree = parse_source(streambuffer)
    transformer = parse_template(xml_tree)
    if transformer:
        params = get_params(xml_tree)
        result_tree = transformer(xml_tree, **params)
        result_tree.xinclude()
        return result_tree
    else:
        return streambuffer.getvalue()

def parse_request(environ):
    path = environ['PATH_INFO'].lstrip('/')
    filespec = smoothpath('C:/webroot/sites/wsgitest/content', path, 
'page.xml')
    return filespec

def application(environ,start_response):
    
    start = time.clock()
    buffer = StringIO()
    try:
        buffer.write(readfile(parse_request(environ)))
        result_tree = transform(buffer)
        end = time.clock()
        try:
            # Looks for %f and %i in output, inserts transform time
            # and pages per second if found
            result = str(result_tree) % (float(end - start), int(1.0/(end - 
start)))
        except:
            result = str(result_tree)
        status = '200 OK'
    except IOError:
        status = '404 FILE NOT FOUND'
        result = '404 FILE NOT FOUND'
    finally:
        # Prepare HTTP response
        response_headers = 
[('Content-Type','text/html'),('Content-Length',str(len(result)))]
        start_response(status,response_headers)
        return([result])

if __name__ == '__main__':

    def start_response(status, response_headers):
        pass

    environ = {}
    environ['PATH_INFO'] = '/'

    result = application(environ, start_response)

    for line in result:
        print line



-- 
You received this message because you are subscribed to the Google Groups 
"modwsgi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/modwsgi.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to