[mod_python] Trouble fetching POST arguments

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


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




Graham Dumpleton wrote:

> Point whatever form you are using at:
> 
>   http://dscpl.user.openhosting.com/~grahamd/testing/details.py
> 
> Eg:
> 
> <form action="http://dscpl.user.openhosting.com/~grahamd/testing/details.py" method="post">
>        <div>
>         Handle:
>         <input type="text" name="handle" maxlength="32"/>
> 
>         Password:
>         <input type="password" name="password" maxlength="32"/>
>         <input type="submit" name="login" value="Log in!"/>
>        </div>
> </form>
> 
> That URL will display various details about the request and for me at
> least for a post form, yields something for req.read(). As an example,
> try:
> 
>   http://dscpl.user.openhosting.com/~grahamd/testing/form.html
> 
> You can see my code for generating this at:
> 
>   http://dscpl.user.openhosting.com/~grahamd/testing/form-html.txt
>   http://dscpl.user.openhosting.com/~grahamd/testing/details-html.txt
>   http://dscpl.user.openhosting.com/~grahamd/testing/details-py.txt
> 
> I'll leave this up for a while, but will take it down at some point.
> 
> Hope this helps.
> 
> Graham
> 
> Davin Boling wrote ..
> 
>>(First of all, a big thanks to Graham for putting up with a thinly 
>>veiled attempt of escapism from Too Many Mailing Lists syndrome. :) That
>>said, no offense to him, the e-mail he forwarded really wasn't mailing
>>list material: I just wanted a quick second opinion to make sure I was
>>sane.)
>>
>>
>>I was working with my own custom handler when I ran into a random 
>>roadblock: for some reason the headers of submitted forms were being 
>>eaten, and I'm not using mod_python.publisher! With req.read() returning
>>blank strings, it was obvious that util.FieldStorage(req) wasn't going
>>to be of much use. I also tried a simple test, which offered some very
>>bizarre results. I changed the top of my handler to the following:
>>
>>def handler(req):
>>     test = req.read()
>>     req.log_error(test)
>>
>>And this is what I get whenever I try to POST to it:
>>
>>[Wed Mar 16 19:27:53 2005] [error] [client X.X.X.X] GET, referer: 
>>http://real.url/nothere
>>
>>Very interesting, GET instead of POST. Maybe my HTML was at fault? I 
>>wrote up a small test form that was *nothing* but a good form: same result.
>>
>>
>>
>>At my wit's end, I wrote a quick handler from scratch and placed it into
>>the same environment. I didn't restart Apache, all I did was make a copy
>>of __init.py__ and overwrite it with a simple test. Interestingly 
>>enough, the "handler from scratch" worked as expected: req.read() 
>>returned a non-empty string, and req.method returned "POST".
>>
>>I overwrote __init.py__ again with the original version, and reran the
>>same form. ...Back to GET again. It makes no sense! It's like something
>>upstream is "eating" req.read(), but how is that possible when I'm 
>>fetching the contents of req.read *at the start* of my handler(req) 
>>function?
>>
>>Here's my Apache configuration for the virtual host in question, if it
>>helps:
>>
>><VirtualHost 69.15.43.130:80>
>>ServerName foo.bar.baz
>>DocumentRoot /not/a/real/path
>>   <Directory /not/a/real/path>
>>    PythonDebug On
>>    SetHandler mod_python
>>    PythonHandler handler
>>    <IfModule mod_access.c>
>>      Order allow,deny
>>      Allow from all
>>    </IfModule>
>>   </Directory>
>></VirtualHost>
>>
>>
>>
>>(I'd share the code in question, but it's going to be placed in a secure
>>environment and I can't have it archived to the mailing list. I'll 
>>report my results when I find the culprit, but in the meantime I'd 
>>appreciate feedback on what people think might be going wrong.)
>>
>>_______________________________________________
>>Mod_python mailing list
>>Mod_python at modpython.org
>>http://mailman.modpython.org/mailman/listinfo/mod_python



More information about the Mod_python mailing list