Probleme mit Ajax unter Prototype und CherryPy

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Fintan
User
Beiträge: 4
Registriert: Donnerstag 19. Juni 2008, 15:44

Donnerstag 19. Juni 2008, 16:28

Hallo zusammen,

ich habe das Problem, dass mein Request an den CherryPy Server nicht zu funktionieren scheint.
Ich benutze Prototype Javascript für Ajax, der Cherrypy Server ist unter localhost:8080 zu erreichen.

Wenn ich jetzt in meinem Testprogramm ein Request an den Localhost wo Apache unter XAMPP läuft schicke klappt es ohne Probleme, sobald ich aber an localhost:8080 schicke gibt er mir nichts aus, noch nicht einmal den alert der bei "onFailure" kommen sollte.
Allerdings spuckt der CherryPy Server auch keine Meldung aus wie er es tut wenn ich über den Browser auf localhost:8080 zugreife.
Trotzdem gibt mir der Cherrypy Server aber so wie er es sollte "Test" aus wenn ich ihn in Firefox direkt anspreche.

Code: Alles auswählen

import cherrypy

class HomePage:
    def index(self):
        return 'test'
    
    index.exposed = True

root = HomePage()
cherrypy.tree.mount(root)

if __name__ == '__main__':
    import os.path
    cherrypy.config.update(os.path.join(os.path.dirname(__file__), 'side.conf'))
    cherrypy.server.quickstart()
    cherrypy.engine.start()
Javascript-Code:

Code: Alles auswählen

function test()
{
    alert("dies ist ein test");
    new Ajax.Request('http://localhost:8080/',
    {
        method:'get',
        onSuccess: function(transport)
        {
            var response = transport.responseText || "no response text";
            alert("Success! \n\n" + response);
        },
        onFailure: function(){ alert('Something went wrong...') }
     });
}

Jetzt frage ich mich nur, wo liegt da der Fehler? Währe echt nett wenn mir da jemand weiterhelfen könnte.
slapshot1979
User
Beiträge: 9
Registriert: Montag 16. Juni 2008, 12:04

Donnerstag 19. Juni 2008, 17:30

Also wenn ich mir ein einfaches HTML-Dokument im gleichen Ordner bastel, welches deine Javscript Datei aufruft, funktioniert das bei mir.

bla.js musst du dann gegen dein Script austauschen

Code: Alles auswählen

<html>
     <head>
         <script type="text/javascript" src="bla.js"></script>
     </head>

<body onload="test()">

</body>

</html>
Alternativ kannst du natürlich auch den Javascript Code direkt in HTML-Dokument schreiben.

Hast du denn vorher über die Eingabeaufforderung dein Cherrypy Script gestartet?
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, 17:51

Hallo Fintan!

Willkommen im Python-Forum!

Vielleicht hast du es auch mit so einem ähnlichen Problem zu tun wie es hier aufgetaucht ist: http://www.python-forum.de/topic-15045.html

Probiere es doch mal aus und greife über AJAX nicht auf die index-Methode, sondern auf eine andere Methode zu. Vielleicht funktioniert es dann auch bei dir.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Fintan
User
Beiträge: 4
Registriert: Donnerstag 19. Juni 2008, 15:44

Donnerstag 19. Juni 2008, 18:49

Hallo,
danke für die Antworten.
Ich habe mir das Thema mal durchgelesen und dann an meinem Code getestet, der nun wie folgt aussieht:

Code: Alles auswählen

import cherrypy

class HomePage:
    def index(self):
        return 'test'
    
    index.exposed = True
    
    def testohne(self):
        return 'test ohne index'
    
    testohne.exposed = True
    

    
class Test2:
    def index(self):
        return 'test2'
        
    index.exposed = True
    
    def test3(self):
        return 'test3'
        
    test3.exposed = True

root = HomePage()
root.test2 = Test2()
cherrypy.tree.mount(root, "/test")

if __name__ == '__main__':
    import os.path
    cherrypy.config.update(os.path.join(os.path.dirname(__file__), 'side.conf'))
    cherrypy.server.quickstart()
    cherrypy.engine.start()
    tools.trailing_slash.on = False
    
habe es auch mal ohne Test2() mit root = HomePage().testohne() probiert das tools.trailing_slash.on wieder rausgenommen und alles mögliche dann in meinem Script durchgetestet (also localhost:8080/test/testohne/, ../test/test2 und ../test/test2/test3) aber nichts hat da geholfen. Ich bekomme immer noch keine Reaktion auf mein Request.
Oder habe ich da jetzt einfach etwas falsch verstanden?
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, 21:41

Fintan hat geschrieben:Ich benutze Prototype Javascript für Ajax, der Cherrypy Server ist unter localhost:8080 zu erreichen.

Wenn ich jetzt in meinem Testprogramm ein Request an den Localhost wo Apache unter XAMPP läuft
Hallo Fintan!

Kann es sein, dass die HTML-Seite nicht von CherryPy gehostet wird? Kann es sein, dass die HTML-Seite über den Port 80 geöffnet wird und du versuchst beim AJAX-Request auf Port 8080 zuzugreifen?

http://www.prototypejs.org/learn/introduction-to-ajax
Remember that for security reasons (that is preventing cross-site scripting attacks) Ajax requests can only be made to URLs of the same protocol, host and port of the page containing the Ajax request. Some browsers might allow arbitrary URLs, but you shouldn't rely on support for this.
Meldet dir der "Firebug" (Firefox Extention) keinen Fehler?

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Fintan
User
Beiträge: 4
Registriert: Donnerstag 19. Juni 2008, 15:44

Donnerstag 19. Juni 2008, 23:26

Hallo,
also Port 8080 ist der Port, da greife ich auch mit dem Firefox drauf zu, Firebug zeigt mir da keine Fehler an.

Das hier
Remember that for security reasons (that is preventing cross-site scripting attacks) Ajax requests can only be made to URLs of the same protocol, host and port of the page containing the Ajax request. Some browsers might allow arbitrary URLs, but you shouldn't rely on support for this.
hab ich aber bisher nicht beachtet. Also werd ich die Seite erstmal in Python einbinden und gucken ob es dann was macht.

Danke für die Hilfe :-) Ich hoffe nur das funktioniert dann auch endlich.

Update:
ooook, jetzt hab ich meine xhtml Datei mal in den Cherrypy Code eingebunden:

Code: Alles auswählen

import cherrypy

class HomePage:

    @cherrypy.expose
    def index(self):
        return file("test.xhtml")

class Test2:
    
    @cherrypy.expose
    def index(self):
        return 'test2'
        
    def test3(self):
        return 'test3'
        
root = HomePage()
root.test = Test2()

cherrypy.tree.mount(root)

if __name__ == '__main__':
    import os.path
    cherrypy.config.update(os.path.join(os.path.dirname(__file__), 'side.conf'))
    cherrypy.server.quickstart()
    cherrypy.engine.start()
    tools.trailing_slash.on = False
und bekomme folgende Fehler von Firebug:
test is not defined
onload(load )

[Exception... "Component is not available" nsresult: "0x80040111 (NS_ERROR_NOT_AVAILABLE)" location: "JS frame :: file:///C:/PROGRA~1/MOZILL~1/components/nsSessionStore.js :: sss_saveState :: line 1753" data: no]
[Break on this error] oState.session = { state: ((this._loadState == STATE_RUNNING) ? STATE_RUNNIN...
Also den ersten Fehler verstehe ich ja noch, da ärgert mich jetzt Cherrypy indem es mir folgendes anstelle des Javascript codes einbindet:

Code: Alles auswählen

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2<html>
3<head>
4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
5 <title>404 Not Found</title>
6 <style type="text/css">
7 #powered_by {
8 margin-top: 20px;
9 border-top: 2px solid black;
10 font-style: italic;
11 }
12
13 #traceback {
14 color: red;
15 }
16 </style>
17</head>
18 <body>
19 <h2>404 Not Found</h2>
20 <p>The path '/test.js' was not found.</p>
21 <pre id="traceback">Traceback (most recent call last):
22 File "c:\python25\lib\site-packages\cherrypy\_cprequest.py", line 551, in respond
23 cherrypy.response.body = self.handler()
24 File "c:\python25\lib\site-packages\cherrypy\_cperror.py", line 198, in __call__
25 raise self
26NotFound: (404, "The path '/test.js' was not found.")
27</pre>
28 <div id="powered_by">
29 <span>Powered by <a href="http://www.cherrypy.org">CherryPy 3.0.3</a></span>
30 </div>
31 </body>
32</html>
Die zweite Fehlermeldung kommt wahrscheinlich wegen genau dem selben Problem mit der Prototype.js Datei.
Jetzt währe also erstmal meine Frage: Wie binde ich die Javascript Dateien ein, so das Cherrypy sie auch kennt? (Alle Dateien liegen im selben Verzeichnis ohne unterverzeichnisse)

Update2:
Da habe ich jetzt zu vorschnell gefragt.

Code: Alles auswählen

import cherrypy

class HomePage:

    @cherrypy.expose
    def index(self):
        return file("test.xhtml")
        
    @cherrypy.expose
    def prototype(self):
        return file("prototype-1.6.0.2.js")
    
    @cherrypy.expose
    def testjs(self):
        return file("test.js")

class Test2:
    
    @cherrypy.expose
    def index(self):
        return 'test2'
        
    def test3(self):
        return 'test3'
        
root = HomePage()
root.test = Test2()

cherrypy.tree.mount(root)

if __name__ == '__main__':
    import os.path
    cherrypy.config.update(os.path.join(os.path.dirname(__file__), 'side.conf'))
    cherrypy.server.quickstart()
    cherrypy.engine.start()
    tools.trailing_slash.on = False
Und Javascript so einbinden:

Code: Alles auswählen

        <script src="http://localhost:8080/prototype" type="text/javascript"></script>
        <script src="http://localhost:8080/testjs" type="text/javascript"></script>
So funktioniert jetzt alles und danke nochmal für die Hilfe und die Ratschläge!
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:18

Fintan hat geschrieben:Wie binde ich die Javascript Dateien ein, so das Cherrypy sie auch kennt? (Alle Dateien liegen im selben Verzeichnis ohne unterverzeichnisse)
Hallo Fintan!

Du kannst CherryPy veranlassen, CSS-Dateien und JavaScript-Dateien direkt auszuliefern.

http://halvar.at/python/cherrypy_cheeta ... ausliefern

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten