Hi mc_mak!
Ja, das kann man. Ich greife in AJAX-Belangen aber immer auf eine kleine Bibliothek zurück, die mir das Arbeiten damit ein wenig erleichtert.
Da ich mich aber immer nur mit AJAX in Verbindung mit Zope befasst habe, wusste ich jetzt auf Anhieb nicht, wie das mit AJAX ohne so einen Server wie Zope läuft. Deshalb habe ich ein kleines Beispiel gestrickt.
Meinen CGI-Testordner habe ich einfach mal im Ganzen gezippt und auf meine Website hochgeladen.
http://gerold.bcom.at/python/python_code/cgi_test.zip
In dieser Zip-Datei befindet sich der Testserver von Jens. Diesen muss du starten. Danach gibst du in deinem Browser "
http://localhost:8888/" ein und schon solltest du vom Testserver eine Übersicht bekommen.
Der AJAX-Test befindet sich im Ordner "cgi_test\cgi-bin\ajax_test".
Das Beispiel zeigt auf, wie du Daten an ein Python-CGI-Skript übergeben kannst und wie du korrekten XMLRPC-Code zurück lieferst. In der HTML-Datei sieht man deutlich, wie einfach es mit
mini-ajax ist, den Inhalt eines Tags auszutauschen.
Hier die Daten, aber ohne CGI-Server und Datenstruktur:
index.html:
Code: Alles auswählen
<html>
<head>
<script src="ajax.js"></script>
<script language="JavaScript">
function get_time() {
id = document.getElementById("txt_id").value;
url = "/cgi-bin/ajax_test/time_seconds.py?id=" + id;
ajax.update(url, "ergebnis");
}
</script>
</head>
<body>
<form>
Id: <input type="text" id="txt_id">
<input type="button" value="Anfrage starten" onClick="get_time()">
</form>
<p id="ergebnis">
[Ergebnis]
</p>
</body>
</html>
ajax.js:
Code: Alles auswählen
// mini/ajax.js - http://timmorgan.org/mini
function $(e){if(typeof e=='string')e=document.getElementById(e);return e};
function collect(a,f){var n=[];for(var i=0;i<a.length;i++){var v=f(a[i]);if(v!=null)n.push(v)}return n};
ajax={};
ajax.x=function(){try{return new ActiveXObject('Msxml2.XMLHTTP')}catch(e){try{return new ActiveXObject('Microsoft.XMLHTTP')}catch(e){return new XMLHttpRequest()}}};
ajax.serialize=function(f){var g=function(n){return f.getElementsByTagName(n)};var nv=function(e){if(e.name)return encodeURIComponent(e.name)+'='+encodeURIComponent(e.value);else return ''};var i=collect(g('input'),function(i){if((i.type!='radio'&&i.type!='checkbox')||i.checked)return nv(i)});var s=collect(g('select'),nv);var t=collect(g('textarea'),nv);return i.concat(s).concat(t).join('&');};
ajax.send=function(u,f,m,a){var x=ajax.x();x.open(m,u,true);x.onreadystatechange=function(){if(x.readyState==4)f(x.responseText)};if(m=='POST')x.setRequestHeader('Content-type','application/x-www-form-urlencoded');x.send(a)};
ajax.get=function(url,func){ajax.send(url,func,'GET')};
ajax.gets=function(url){var x=ajax.x();x.open('GET',url,false);x.send(null);return x.responseText};
ajax.post=function(url,func,args){ajax.send(url,func,'POST',args)};
ajax.update=function(url,elm){var e=$(elm);var f=function(r){e.innerHTML=r};ajax.get(url,f)};
ajax.submit=function(url,elm,frm){var e=$(elm);var f=function(r){e.innerHTML=r};ajax.post(url,f,ajax.serialize(frm))};
time_seconds.py:
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
print "Content-Type: text/xml; charset=iso-8859-1"
print
import cgi
import cgitb; cgitb.enable()
import xmlrpclib as xlib
import time
# So bekommst du die ID (damit kannst du machen was du willst):
# http://localhost:8888/cgi_bin/ajax_test/time_seconds.py?id=2
fs = cgi.FieldStorage()
id = int(fs.getvalue("id", "0"))
data = (time.time(), )
print xlib.dumps(data, methodresponse = True, encoding = "iso-8859-1")
Dass du in der Python-CGI-Datei natürlich auf jede Datenbank zugreifen kannst, für die eine Python-Schnittstelle installiert ist, sollte klar sein. (MS-SQL, PostgreSQL, MySQL, SQLite, Access, ...)
lg
Gerold