[mod_python] Trouble fetching POST arguments

Davin Boling davin at wordpainter.net
Wed Mar 16 21:35:35 EST 2005

(forgive the double-mail Graham, replied direct and didn't hit the list 
by accident)

I took your suggestion involving time.sleep, but it made no difference. 
As for grabbing the content-length in the method you described...the 
plot thickens!

Using your code at the very beginning of the handler(req):, I get the 
following exception:

Mod_python error: "PythonHandler handler"

Traceback (most recent call last):

   File "/usr/lib/python2.3/site-packages/mod_python/apache.py", line 
299, in HandlerDispatch
     result = object(req)

   File "/home/davin/public_html/demo/handler/__init__.py", line 83, in 
     length = int(req.headers_in["content-length"])

KeyError: 'content-length'

Graham Dumpleton wrote:

> Davin Boling wrote ..
>>I've got an example that works correctly already. The problem is that in
>>the larger handler that I've written, SOMETHING is breaking. I can't 
>>understand at all why req.read() returns nothing on a POST when it's the
>>very first thing I assign to a variable. I'm about to go on a commenting
>>crusade to narrow down where the problem is.
>>This is my "from scratch" handler, which works correctly...just to show
>>that I know how to handle a POST:
>>from mod_python import apache
>>def handler(req):
>>     head = """
>>            <?xml version="1.0" encoding="utf-8"?>
>>            <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
>>             "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
>>             <html>
>>             <head>
>>             <title>Debug</title>
>>             </head>
>>             <body>
>>            """
>>     data = req.read()
>>     method = req.method
>>     req.content_type = "text/html"
>>     req.write(head + data + method + '</body></html>')
>>     return apache.OK
> Get the content length out of the headers and supply it to req.read()
> and see if that makes a difference. Ie.,
>       length = int(req.headers_in["content-length"])
>       data = req.read(length)
> Also note what documentation says about timeouts.
>   read([len])
>     Reads at most len bytes directly from the client, returning a  string
>     with the data read. If the len argument is negative or omitted, reads
>     all data given by the client.
>     This function is affected by the Timeout Apache configuration  directive.
>     The read will be aborted and an IOError  raised if the Timeout is reached
>     while reading client data.
>     This function relies on the client providing the Content-length  header.
>     Absence of the Content-length header will be treated as  if
>     Content-length: 0 was supplied.
>     Incorrect Content-length may cause the function to try to read  more
>     data than available, which will make the function block until a  Timeout
>     is reached.
> One would expect an IOError according to this if a timeout occured, but
> maybe it isn't being generated for some reason.
> You might also add:
>   time.sleep(10)
> at the start of your handler and see if it makes a difference. Ie., try and
> determine if it is the time the client takes to send the post data.
> Graham

More information about the Mod_python mailing list