I'm trying to setup a simple script where some data is sent using the jQuery .ajax function to a Python CGI script. The Python script would just make the data posted to it uppercase, and then return that data to the HTML file, where a div would be updated with the content.
I have the code shown below. When I run it, the AJAX call executes, but the div is not updated with the content. the div is not updated with the data being sent.
How would I modify this code so that it updates with the data being sent?
I appreciate any help at all.
My HTML Code:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8">
<title>Python-jQuery Example</title>
<script src="http://code.jquery.com/jquery-2.0.3.js"></script>
<script>
$(function()
{
$.ajax({
url: "http://localhost/cgi-bin/post.py",
type: "post",
datatype: "html",
data: "here is data",
success: function(response){
$("#div").html(response);
console.log("There is a response");
}
});
});
</script>
</head>
<body>
<div id="div">Default Stuff</div>
</body>
My Python Code:
#!/usr/bin/python
import cgi, cgitb
cgitb.enable()
data = cgi.FieldStorage()
print "Content-Type: text/html"
print data
EDIT: I have updated my code to what is currently shown, and now the document updates with this string:
FieldStorage(None, None, [])
How would I modify my code so that the div updates with the data being sent?
I believe that the "data" inside the $.ajax should be like a hash of a key-value pairs. try:
$.ajax(
....
data: {
a: "aa",
b: "bb"
}
...
If you see in the div something like:
MiniFieldStorage('a', 'aa')
Then you should access it via:
my_param = cgi.getfirst('a')
print "Content-Type: text/html
"
print my_param
If it's still not working, can you test it via GET instead of POST ? In addition, what's the structure of the AJAX file(s) that you're accessing ? ( is the file inside a sub-directory ? etc... )
I figured out that the data needs to be formatted as key-value pairs, like so:
$.ajax({
url: "http://localhost/cgi-bin/variousTests/post.py",
type: "POST",
data: {foo: 'bar', bar: 'foo'},
success: function(response){
$("#div").html(response);
}
});
In the Python script, I used this code to get the data from the POST request (it works the exact same way if a GET request is used):
#!/usr/bin/python
import cgi, cgitb
cgitb.enable() # for troubleshooting
#the cgi library gets vars from html
data = cgi.FieldStorage()
#this is the actual output
print "Content-Type: text/html
"
print "The foo data is: " + data["foo"].value
print "<br />"
print "The bar data is: " + data["bar"].value
print "<br />"
print data
I think you need to use a newline with the content type printing.
print "Content-Type: text/html "
Also, you need to provide the parameter name with your variable data. Assuming you are posting the value "xyz" with the parameter "param". So it should be: data["param"] at where the xyz resides.
print data["xyz"]
If the error still persist, then browse the url localhost/cgi-bin/post.py from the browser and check what does it return(with a GET parameter for testing of course).