[mod_python] Trouble fetching POST arguments

Graham Dumpleton grahamd at dscpl.com.au
Wed Mar 16 21:28:15 EST 2005


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