|
Nando Drabik
nandogringo at gmail.com
Thu Aug 10 16:03:39 EDT 2006
Hi all,
I would like some help fixing the problem I am stuck in. To make this as
short and simple as possible, it has mostly to do with the
cgi.FieldStorage class. I have:
1) mod_python installed correctly on apache2
2) File test.py (resides under cgi-bin):
3) HTML file that sends out XMLHttpRequest from js
test.py ===============================
#!/usr/bin/env python
import sys, re, cgi
import cgitb; cgitb.enable(display=0,logdir=".")
sys.path.insert(0,'/opt/atlas/lib/python')
from jsonutils import jsonrpc
htmlTemplate = """Content-Type: text/html
<html>
<head><title>%(title)s</title></head>
<body>
%(body)s
</body></html>
"""
fields = cgi.FieldStorage()
req = fields.getvalue("myVar") ## THIS IS WHERE THE WHOLE THING CRAHSES
print htmlTemplate % { 'title': "Result", 'body': req}
=====================================
When I access /server/cgi-bin/test.py?myVar='content', by directly
typing the URL on firefox, I do receive back "content", no problem.
However, from an html file, if I send and XMLHttpRequest in javascript
like this:
HTML/JS snippet ===========================
var req = new XMLHttpRequest();
rep.open("post", "http://server/cgi-bin/test.py")
req.send("myVar=10"):
=====================================
The script crashes when the request is sent. After debugging, I've
realized that the problem is in the FieldStorage class. Here's the
output from the error log:
error log ===============================
problem occurred in a Python script. Here is the sequence of function
calls leading up to the error, in the order they occurred.
/srv/www/cgi-bin/atlas/test.py
28 fields = cgi.FieldStorage()
29 req = fields.getvalue("myVar")
req undefined, fields = FieldStorage(None, None, 'myVar=10'),
fields.getvalue = <bound method FieldStorage.getvalue of
FieldStorage(None, None, 'myVar=10')>
/usr/lib/python2.4/cgi.py in getvalue(self=FieldStorage(None, None,
'myVar=10'), key='myVar', default=None)
565 def getvalue(self, key, default=None):
566 """Dictionary style get() method, including 'value' lookup."""
567 if key in self:
568 value = self[key]
569 if type(value) is type([]):
key = 'myVar', self = FieldStorage(None, None, 'myVar=10')
/usr/lib/python2.4/cgi.py in __contains__(self=FieldStorage(None, None,
'myVar=10'), key='myVar')
616 """Dictionary style __contains__ method."""
617 if self.list is None:
618 raise TypeError, "not indexable"
619 for item in self.list:
620 if item.name == key: return True
builtin TypeError = <class exceptions.TypeError>
TypeError: not indexable
args = ('not indexable',)
====================================================
I am new to python, so I'm a bit confused. If I print the variable
'fields' in test.py, it displays the list (FieldStorage(None, None,
'myVar=10')) just fine, but the methods getvalue, getfirst, etc raise
TYPE exceptions(not indexable). Interestingly, the has_key method works.
So, I have been unable to retrieve the post data from the
XMLHttpRequest. Can anyone help me figure out how to access the post
variables from mod_python residing under a cgi-bin directory?
Thank you very much in advance!
Fernando
Fernando Drabik <fernando.drabik at noaa.gov>
OceanEye Web Application Developer
Coral Reef Ecosystem Division
NOAA Fisheries
|