[mod_python] how to handle xforms with publisher handler

Jim Gallacher jpg at jgassociates.ca
Thu Jan 11 20:28:26 EST 2007

Emiliano Moscato wrote:
> Hi all!
> I'm getting crazy trying to receive xforms xml data with mod_python +
> publisher handler.
> In a normal HTML form, the data would be sent as
> application/x-www-form-urlencoded, in the XForms world however, this
> information is sent as XML formatted data (application/xml).
> Up to now I've used cherryPy as web server and I've got my xml data with
> cherrypy.threadData.xform.
> I've read that PHP receive this in $HTTP_RAW_POST_DATA variable. If I send
> the form to a php script all work fine.
> But when I try to submit a xforms with method POST to a script managed by
> publisher handler I get an error with no log in my apache server error log.
> Any help?

You'll need to elaborate on the error you are getting, but I think part 
of the problem is that you are bumping up against part of the internal 
"magic" of publisher.

Publisher automatically creates a FieldStorage instance. Unfortunately 
FieldStorage assumes that the content-type starts with either 
"application/x-www-form-urlencoded" or "multipart/". If I had to guess 
I'd say that you are getting "501 Not Implemented error" as a result.

Here are a couple of solutions that you might consider as a workaround:

1. Hack util.FieldStorage to properly handle your content-type. If you 
do this feel free to submit a patch so FieldStorage can be fixed. ;)

2. Hack publisher to skip the automatic creation of FieldStorage. (Line 
424 in publisher.py for mod_python 3.3.0b). You can then use req.read() 
to read and process the POST'd data within your content handler.

3. Use a PythonFixupHandler before the content handler. In the 
fixuphandler use req.read() to grab the raw data and adjust the 
content-type header so that FieldStorage doesn't bomb out. Note that if 
you want to pass xml field data as parameters to your handler method 
you'll need to do a bit more work. For example

def index(foo="bar"):
     return "whatever"

won't get foo from your xml data. You can likely work around this but 
you'll need to take a look at the source for FieldStorage and publisher 
to work out a strategy.

I hope this helps.


More information about the Mod_python mailing list