> Hi,
> 
> I've passed this through the interperter line-by-line, yet still can't
> get it to work right.
> 
> The first time the cgi driver script initiates it runs the login
> function which renders a zpt. Upon submission of their vitals,  the

I'm not sure what a zpt is, but it sounds like the form to request the vitals, 
so that's a 
start. :)

> user is authenticated via sqlobject, and if they pass the chapters
> function should run. However, what I get is zip, zilch, nada. Just a
> blank page, with the query string appended to the url.

First off, make sure that you have the "Content-Type: text/html\n\n"
line print before anything else whenever you send output to the web.  
Presumably it worked for the form display, but you have to keep resending it 
each time 
the page changes.  


> def main(form):
>    if form.has_key('author') and form.has_key('password'):
>       q = Users.select(AND(Users.q.author==form.get('author'),
>                           Users.q.password==form.get('password')))
>       if len(list(q))>0:
>          chapters(author=form.get('author'))
>       else:
>          login(failure=True)
>    else:
>       login(failure=False)

Without seeing the def for login(failure), and not being familiar with SQL, 
I'll take a pass 
on these lines, but I am curious why you declare failure as true or false in 
the login 
function?

> 
> Out of curiosity I wrote a simple test cgi.
> 
> #!/usr/local/bin/python
> 
> print 'Content-type: text/plain\n\n'
> 
> import cgi
> 
> form = cgi.FieldStorage()
> if form.has_key('author') and form.has_key('password'):
>         print form.keys()
>         print form.get('author')
>         print form.get('password')

Instead of form.get(), try this:

          print form['author'].value
          print form['password'].value

Working with cgi scripts is always a bit tricky because of the added variable 
of the server 
displaying the page, so I define this little function on anything I am working 
on:


from sys import stderr   # Unix only!

def s(msg):
    s = stderr.write        # Sends messages to the error log via s()
    s(msg + '\n')           # adds a carriage return :)


Someone else more versed than I could probably tell you if there is a windows 
equivalent, but what I do is open another shell and tail -f the error log while 
I test the 
script.  Any errors or tracebacks appear there anyway, and I can add little 
notes between 
functions to see where the thing breaks down.  Especially handy to 
"pre-display" the 
expected output to make sure I get what I expect, and its not the web server 
that's eating 
the result or something.

> 
> Strangely, the calls to print form.get('author') and
> form.get('password') don't appear in the output. Only the form.keys()
> appears.
> 
> Additionally, why doesn't def main(form=cgi.FieldStorage()) work, I
> tried to do it as so, thinking it more graceful, and it floundered.

I am not sure about this, but I've always put the form = cgi.Fieldstorage in 
the global 
namespace so I could get at it with subsequent functions.

I am guessing that your version didn't work because the form namespace isnt 
getting 
filled with cgi.Fieldstorage --before-- the function is defined.  Remember 
python tries to 
look through all the defs and make sure they are syntactically correct before 
actually 
running the script.  You probably got an AttributeError, right?

Patric

OBTW...  the .value method might be superceded by newer versions of python.  I 
am not 
well versed on all the changes in 2.4 yet.  :)

> _______________________________________________ Tutor maillist  - 
> Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
> 


_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to