Cherrypy und Ajax

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Mr.Who
User
Beiträge: 8
Registriert: Samstag 10. November 2007, 22:05
Kontaktdaten:

Dienstag 17. Juni 2008, 22:27

Hallo,

habe folgendes Problem:

Bin neu in Cherrypy!

Mal Spass beiseite.
Habe einen ganz einfachen Cherrypy Server geschrieben -->

Code: Alles auswählen

import cherrypy



class root:
   
    
    def index(self):
	return "asdf"

    index.exposed=True

root = root()

cherrypy.quickstart(root, '/', "cofnig.conf")
So, port ist 80 usw.. eine ganz normale Anfrage mit dem Webbrowser funktioniert also, wenn ich in die Leiste "localhost" eintippe, bekomme ich die Antwort "asdf", soll auch so sein.

Wenn ich ein billiges Html-Document erstelle mit nur einem Anker wie
<a href="localhost">lilalu</a>
bekomme ich eine Anwort!

Aber ich bekomme keine Antwort, wenn eine Request mit Ajax abschicke wie:
Nur ein Teil des Codes, aber der restliche Teil ist ohne Fehler, Anfragen mit Ajax an einen Apache Server funtionieren.

Code: Alles auswählen

		 
"JAVASCRIPT CODE"


 function on_send()
 {
 	if(ajax.readyState == 4)
	{
                       alert(ajax.responseText);
		alert(ajax.getAllResponseHeaders());
	}
 }
	ajax.open('POST','localhost',true);
	ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	ajax.onreadystatechange = on_send;
	ajax.send(null);

Wieso funktioniert das nicht?, liegt es daran, dass es ein fcgi Server ist?
Ich hoffe ihr könnt mir weiterhelfen.
Danke im Voraus!
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Dienstag 17. Juni 2008, 23:43

Mr.Who hat geschrieben:

Code: Alles auswählen

ajax.open('POST','localhost',true);
Hallo Mr.Who!

Leider schreibst du nicht, welche AJAX-Bibliothek du verwendest. Aber ich kann mir vorstellen, dass du auch bei dieser Bibliothek eine URL angeben musst.

Statt "localhost" --> "http://localhost/"

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Mr.Who
User
Beiträge: 8
Registriert: Samstag 10. November 2007, 22:05
Kontaktdaten:

Mittwoch 18. Juni 2008, 11:56

Hi,
das ist ganz normales Ajax glaube ich,
wenn man sich ein normales Ajax Buch kauft steht das genauso drin,
kein Framework.

Welche Bibi benuzt ihr für solche Sachen?
Hat jemand eine weitere Idee was an meine Lösung falsch sein könnte?
Die URL war es nicht, trozdem danke :)
BlackJack

Mittwoch 18. Juni 2008, 12:01

"Ganz normales Ajax" würde ein `XmlHttpRequest`-Objekt benutzen. Du verwendest aber ein Objekt, das `ajax` heisst. Wo kommt das denn her?

Da es zwischen verschiedenen Browsern aber wohl immer noch unterschiede gibt, wäre eine Bibliothek, die davon abstrahiert eine gute Idee.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 18. Juni 2008, 12:39

Mr.Who hat geschrieben:Welche Bibi benuzt ihr für solche Sachen?
jQuery (meist). Oder Mootools (seltener). Oder Athena (nur im Zusammenspiel mit Nevow).
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Mr.Who
User
Beiträge: 8
Registriert: Samstag 10. November 2007, 22:05
Kontaktdaten:

Mittwoch 18. Juni 2008, 12:41

Code: Alles auswählen

"AJAX--- auf die unerschiedliche BRwoser habe ich auch geachtet"
<html>
<head>
</head>

<script type="text/javascript">


var ajax = null;

if (typeof XMLHttpRequest != 'undefined')
{
        ajax = new XMLHttpRequest();
		
		
 }

else if (!ajax)
{
		 try
		 {
			 ajax = new ActiveXObject("Msxml2.XMLHTTP");
			
		 }
	
		 catch(e)
		 {
			  try
			  {
				  ajax = new ActiveXObject("Microsoft.XMLHTTP");
				 
			  }
			
			  catch(e)
			  {
				  ajax = null;
				 
				  window.home();
			  }
		 }
}





 function on_send()
 {
 	if(ajax.readyState == 4)
	{
		alert(ajax.responseText);
		alert(ajax.getAllResponseHeaders());
	}

 }

function start(){

      alert("drin");
 	ajax.open('POST','http://localhost/',true);
	ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	ajax.onreadystatechange = on_send;
        ajax.send(null);
      alert("ende von start");
}

</script>
 
</head>

<body>
<div onclick="start()" style="background-color:#000000; width:100px; height:100px"></div>
</body>
</html>
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mittwoch 18. Juni 2008, 14:43

Mr.Who hat geschrieben:Hat jemand eine weitere Idee was an meine Lösung falsch sein könnte?
Hallo Mr.Who!

Ich weiß nicht was an deiner Lösung nicht richtig funktioniert. Aber es liegt nicht an CherryPy. Das habe ich ausgetestet. Ich habe dafür AJAX-MINI verwendet. Damit ich es einfacher zeigen kann, habe ich es direkt in die Vorlage eingebaut.

Cheetah-Vorlage: index.tmpl:
http://paste.pocoo.org/show/72788/

CherryPy-Programm:
http://paste.pocoo.org/show/72781/

Und ja, es funktioniert bei mir. ;-)

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Mr.Who
User
Beiträge: 8
Registriert: Samstag 10. November 2007, 22:05
Kontaktdaten:

Mittwoch 18. Juni 2008, 15:10

Hi,
was ist eigentlich dieses
"from Cheetah.Template import Template"

Ich möchte zwar deien Lösung auf meinem Rechner testen aber er findet das oben angegebene Template nicht.

Könntest du mir vlt eine Kurze Einleitung geben wie ich mit Ajaxmini eine Anfoderung starte?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mittwoch 18. Juni 2008, 16:14

Mr.Who hat geschrieben:was ist eigentlich dieses
"from Cheetah.Template import Template"
Hallo Mr.Who!

- http://cheetahtemplate.org/
- http://halvar.at/python/cherrypy_cheetah/
- http://snippets.dzone.com/posts/show/2025
- http://halvar.at/krimskrams2/mini-ajax-0.1.1.tar.gz

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Donnerstag 19. Juni 2008, 10:15

Hallo Mr.Who!

Ich habe mich auch noch ein wenig mit JQuery gespielt. Das Ergebnis sieht so aus:

Cheetah-Vorlage: index.tmpl:
http://paste.pocoo.org/show/73465/

CherryPy-Programm:
http://paste.pocoo.org/show/73466/

Gesamt (mit JQuery-Library):
http://halvar.at/krimskrams2/ajax_und_c ... jquery.zip

Ich mag die Art von JQuery nicht, alles in der ``$(document).ready(function()...`` zu binden. Deshalb habe ich die Events, wie bei JavaScript üblich, direkt in den Tags an die Handler gebunden.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Donnerstag 19. Juni 2008, 15:18

gerold hat geschrieben:Ich mag die Art von JQuery nicht, alles in der ``$(document).ready(function()...`` zu binden.
Dafür gibt es übrigens den Shortcut ``$(function() { ... }``.
gerold hat geschrieben:Deshalb habe ich die Events, wie bei JavaScript üblich, direkt in den Tags an die Handler gebunden.
Ein Nachteil dabei ist, dass JavaScript-Code bei jedem Request der (gewöhnlich dynamisch erzeugten) Seite mit übertragen werden muss, während eine separate JavaScript-Code-Datei gecacht werden würde.

Ein anderer ist der, dass man mit separatem JavaScript eine Seite schaffen kann, die ohne JavaScript funktioniert, während bei aktiviertem JavaScript die Seite so verändert wird, dass die dann z.B. AJAX gebraucht.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 19. Juni 2008, 22:32

gerold hat geschrieben:Ich mag die Art von JQuery nicht, alles in der ``$(document).ready(function()...`` zu binden. Deshalb habe ich die Events, wie bei JavaScript üblich, direkt in den Tags an die Handler gebunden.
Ich schon und rate es an, so etwas generell zu machen. So bekommt man nicht nur eine Trennung zwischen Präsentation (CSS) und Inhalt (HTML) sondern auch Verhalten (JS). Ich finde auch, dass es die am wenigsten Invasive Methode ist, noch dazu dass die JavaScript-Handler die Tags teilweise überflüssigerweise lang machen, dass die dann sehr breite Dateien ergeben. Auch kann man auf diese Weise schnell an viele Elemente JS-Actions binden, was man sonst immer manuell machen muss.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Freitag 20. Juni 2008, 11:29

Leonidas hat geschrieben:
gerold hat geschrieben:Ich mag die Art von JQuery nicht, alles in der ``$(document).ready(function()...`` zu binden. Deshalb habe ich die Events, wie bei JavaScript üblich, direkt in den Tags an die Handler gebunden.
Ich schon und rate es an, so etwas generell zu machen. So bekommt man nicht nur eine Trennung zwischen Präsentation (CSS) und Inhalt (HTML) sondern auch Verhalten (JS). Ich finde auch, dass es die am wenigsten Invasive Methode ist, noch dazu dass die JavaScript-Handler die Tags teilweise überflüssigerweise lang machen, dass die dann sehr breite Dateien ergeben. Auch kann man auf diese Weise schnell an viele Elemente JS-Actions binden, was man sonst immer manuell machen muss.
Hallo Leonidas!

Da stimme ich dir voll und ganz zu. Es ist nur so, dass ich es nicht mag, wenn Funktionen in Funktionen und noch mal in Funktionen verschachtelt werden.
Ich will einzelne, (fast) unabhängige Funktionen. Ich mag diese Art der verschachtelten Programmierung nicht wie sie von jQuery propagiert wird.

Aber das ist im Moment sowiso egal, da mich jQuery immer mehr ärgert. Ich habe es nur ausprobiert, weil Armin so dafür geschwärmt hat. Aber ich glaube, dass mir Mochikit mehr liegen wird. Ich glaube allerdings, dass AJAX bei Mochikit irgendwie komplizierter als bei jQuery ist. Aber das werde ich beim nächsten Webprojekt herausfinden. Ich habe bis jetzt nur darüber gelesen und noch nichts damit gemacht. Auch mit jQuery habe ich noch nicht viel gemacht. Ich muss beide Bibliotheken mal miteinander vergleichen, dann weiß ich mehr.

Und schon wieder fühle ich mich wie jemand der gegen den Strom schwimmt. :roll: Aber was soll's.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 20. Juni 2008, 15:17

Ich/wir sind da auch noch recht uneinige, mit welcher JS Lib wir uns näher beschäftigen sollten, siehe: http://pylucid.net:8080/pylucid/wiki/JavaScriptLib

Es gibt so viele ;)

Kennt jemand noch anderen "validierungs Geschichten" ?

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Freitag 20. Juni 2008, 15:29

gerold hat geschrieben:Da stimme ich dir voll und ganz zu. Es ist nur so, dass ich es nicht mag, wenn Funktionen in Funktionen und noch mal in Funktionen verschachtelt werden.
Ich will einzelne, (fast) unabhängige Funktionen. Ich mag diese Art der verschachtelten Programmierung nicht wie sie von jQuery propagiert wird.
Das liegt nicht nur an jQuery, das ist generell so der übliche JavaScript-Stil. Es kommen recht viele anonyme Funktionen vor und das finde ich auch recht brauchbar. Man muss nur darauf achten, die Einrückung richtig zu machen, sonst wirds unübersichtlich. Ich habe auch anfangs veruscht gegen die Sprache zu Arbeiten, so hat mir dieser Event-Driven-Ansatz mit Callbacks nicht sonderlich gefallen, aber man gewöhnt sich dran. Man muss auch nicht einmal Inline-Funktionen nehmen, man kann in JS durchaus auch Funktionen über ihre Namen weiterreichen, wie in Python auch.

Jens, euer Relevanz-Test ist nicht zufällig dadurch entstanden, dass ihr einfach die Vorkommen gewählt habt, oder? Wenn ja, dann ist es schlichtweg bedeutungslos. Dojo ist gar nicht so populär, ich glaube Ajaxian hatte da auch noch Artikel dazu.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten