Offline-Ajax (ohne Webserver)

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Soll eine Windows-Anwendung mit Browser-Oberfläche entwerfen. Dachte an PortableFirefox, HTML und dynamische Inhalte über Ajax und Python.

Problem: Es soll kein Webserver laufen. Bleibt nur noch der Python-Interpreter (python.exe).

Ziel: Über JavaScript und XMLHttpRequest wird ein Python-Script angesprochen und Daten werden übermittelt. Das Python-Script soll die Daten empfangen, auswerten/berechnen und eine Antwort als HTML-Code für den XMLHttpRequest liefern.

Geht das überhaupt? Es müsste ja eine TCP/IP-Verbindung über Sockets sowie die HTTP-Verbindung gefaked werden, oder?
Benutzeravatar
tiax
User
Beiträge: 152
Registriert: Samstag 23. Juli 2005, 17:28
Kontaktdaten:

bei Python ist der SimpleHTTPServer in der Standard-Bibliothek dabei, vielleicht taugt dir das ja
Ne invoces expellere non possis
[url=xmpp://florian@florianheinle.de]xmpp:florian@florianheinle.de[/url]
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Naja, das ist ja quasi ein kompletter HTTP-Server. Die Frage ist, ob das technisch überhaupt geht... also XMLHttpRequest baut ja eigentlich eine HTTP-Verbindung auf. In meinem Fall gibt es ja keinen HTTP-Server, also dürfte eigentlich keine Verbindung zustande kommen. Vielleicht kann man die aber vortäuschen?
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Woran scheitert's?

Hum, könnte man im Python-Script temporär einen HTTP-Server starten, ihn über Sockets an Port 80 binden, die gesendeten Daten vom HTML-Formular als RAW-Daten empfangen (sys.stdin?), in einen HTTP-Request wandeln und an den HTTP-Server übergeben, die Antwort generieren und in Reintextform zurück schicken? Anschließend den HTTP-Server stoppen und alles killen?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Wo ist das Problem, das Skript einfach einen HTTP-Server mitlaufen zu lassen?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Browser-Oberfläche, aber kein Webserver? Ist da nicht ein Denkfehler drin? ;)

Kannst du die Restriktion "kein Webserver" näher erläutern oder evtl. sogar begründen?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

droptix hat geschrieben:Über JavaScript und XMLHttpRequest wird ein Python-Script angesprochen und Daten werden übermittelt. Das Python-Script soll die Daten empfangen, auswerten/berechnen und eine Antwort als HTML-Code für den XMLHttpRequest liefern.
Hallo droptix!

Natürlich geht das. Python hat einen eingebauten XMLRPC-Server. Python hat aber auch einen eingebauten HTTP-Server. Verabschiede dich von dem Gedanken, dass ein Webserver so etwas wie ein Apache sein muss. Siehe: http://www.python-forum.de/topic-5478.html

Wenn ich so etwas machen müsste, dann würde ich keine Zeit damit verplempern, die HTML-Seiten vom Python-Programm zu trennen. Ich würde auch die HTML-Seiten von Python ausliefern lassen. Dann kannst du viel in Python erledigen, was auf der Client (Browser) Seite vielleicht umständlicher ist.

Und noch etwas. Ich würde sofort auf ein Vorlagensystem wie z.B. Cheetah oder Jinja setzen. Das hat nur Vorteile.
Und schrieb ich schon, dass ich CherryPy für so etwas empfehlen würde? :D

mfg
Gerold
:-)

PS: In etwa so, oder so ähnlich:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

import cherrypy
from cherrypy._cptools import XMLRPCController 
import webbrowser


class Root(object):
    
    def index(self):
        return "Hallo Welt"
    index.exposed = True
    

class XmlRpc(XMLRPCController):

    def reversed_text(self, text):
        return {"text": text[::-1]}
    reversed_text.exposed = True 


def main():
    root = Root()
    root.xmlrpc = XmlRpc()
    webbrowser.open_new_tab("http://localhost:8080/")
    cherrypy.quickstart(root)


if __name__ == "__main__":
    main()
Die XMLRPC-Methode ``reversed_text`` ist über ``http://localhost:8080/xmlrpc/reversed_text`` erreichbar.

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

droptix hat geschrieben:Woran scheitert's?
Das man "Verbindungen" nicht einfach "emulieren" kann ... du brauchst nun mal einen Server, der auf der Gegenseite lauscht.
Hum, könnte man im Python-Script temporär einen HTTP-Server starten, ihn über Sockets an Port 80 binden, die gesendeten Daten vom HTML-Formular als RAW-Daten empfangen (sys.stdin?), in einen HTTP-Request wandeln und an den HTTP-Server übergeben, die Antwort generieren und in Reintextform zurück schicken?
Das ist doch genau das, was der eingebaute Webserver von Python tut (abgesehen davon, dass man für Port 80 Admin-Rechte braucht)? Wo liegt denn eigentlich dein Problem?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo droptix!

Eines wollte ich noch los werden: Ich habe vor ein paar Jahren genau so programmiert. Ich dachte, dass es eine super Lösung sei, Zope als lokalen Serverunterbau zu verwenden und Erweiterungen zu meinem Programm auf HTML-Basis zu erstellen.

Es hat sich aber schon nach wenigen Monaten herausgestellt, dass es eine ziemlich schlechte Lösung war. Die Kunden verlangten immer wieder nach Lösungen, die auf HTML-Basis nur sehr schwer zu programmieren waren oder schlecht in den vorhandenen Workflow integriert werden konnten.
Auch wenn es anfänglich sehr verlockend schien. Es hat sich herausgestellt, dass es für mich viel einfacher ist, die Wünsche der Kunden mit einem GUI-Framework wie wxPython umzusetzen.

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

Ich denke es wird langsam sein. Auch wenn noch kein Verbindungsstück zwischen Python und dem Browser existiert, denken wir doch mal wie das ablaufen kann, wenn kein Server da ist.

Der Browser schickt eine Anfrage los und irgendwas starten einen Python Interpreter, der ein das Ergebnis eines Skripts zurück zum Browser liefert.

Das hört sich nach CGI ohne Apache an ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

jens hat geschrieben:Ich denke es wird langsam sein. Auch wenn noch kein Verbindungsstück zwischen Python und dem Browser existiert, denken wir doch mal wie das ablaufen kann, wenn kein Server da ist.
Ne, das müsste dann ein lokaler HTTPd sein, wie ihn jedes Framework mitliefert.
jens hat geschrieben:Das hört sich nach CGI ohne Apache an ;)
Jedes mal den Webserver starten hört sich noch viel schlimmer an. Überleg dir mal, wenn bei jedem Request erstmal der HTTPd hochgefahren wird, dieser wiederrum ein CGI startet, das beendet, der HTTPd den Output des CGIs zurückschickt und dann herunterfährt. Davon mal abgesehen dass das eben nicht geht, weil wenn der HTTPd nicht läuft, dann kommt auch keine Verbindung zustande.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Das Programm läuft ohne Adminrechte, daher gestaltet sich eben ein echter Server über Ports schwierig. Da es auch portabel sein soll, kann man nicht auf einen fest vorinstallierten HTTP-Server vom System zurückgreifen.

Ich brauche eine portable, einfache GUI, daher die Idee via HTML. Außerdem beherrsche ich wxPython nicht so gut. Hab mich mal mit wxGlade abgequält, aber damit kriege ich sicher nicht das hin was ich mir vorstelle.

Weiteres Thema: mit dem Starten der Anwendung (also in meiner Idee PortableFirefox) soll kein zweites Fenster aufgehen. Man könnte sicher noch den Server mit einer GUI starten und das Fenster dann verstecken... aber wie schließt man es?

Dass Python jede Menge tolle Sachen wie SimpleHTTPServer oder XMLRPCServer mitbringt ist mir klar, aber damit komme ich wieder auf das Zweite-Fenster-Problem.

--

Was ja funktioniert: Wenn ich via XMLHttpRequest auf eine Textdatei zugreife, die HTML-Code beinhaltet, dann kann ich damit arbeiten.

Bleibt die Frage, ob ich die Anfrage statt an eine Textdatei an ein Python-Script senden kann, welches der Anfrage einen künstlichen Textdatei-Stream samt Header (Content-type: text/plain) zurück gibt? Vielleicht über diese StringIO-Dinger? Dann brauch ich das Thema Server und Sockets nicht mehr.

Das Problem wird aber sein, dass das Python-Script wahrscheinlich nicht ausgeführt wird, oder?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

droptix hat geschrieben:Das Programm läuft ohne Adminrechte, daher gestaltet sich eben ein echter Server über Ports schwierig. Da es auch portabel sein soll, kann man nicht auf einen fest vorinstallierten HTTP-Server vom System zurückgreifen.
Würde mich wundern. Bei Unices braucht man nur root-Rechte wenn man Ports < 1024 öffnen will, wäre erstaunt wenn unter anderen Systemen sockets noch weiter eingeschränkt wären.
droptix hat geschrieben:Weiteres Thema: mit dem Starten der Anwendung (also in meiner Idee PortableFirefox) soll kein zweites Fenster aufgehen. Man könnte sicher noch den Server mit einer GUI starten und das Fenster dann verstecken... aber wie schließt man es?
Einfach den Python-Prozess mit ``pythonw`` starten, dann geht kein Fenster für Python auf.
droptix hat geschrieben:Dass Python jede Menge tolle Sachen wie SimpleHTTPServer oder XMLRPCServer mitbringt ist mir klar, aber damit komme ich wieder auf das Zweite-Fenster-Problem.
Nein.
droptix hat geschrieben:Bleibt die Frage, ob ich die Anfrage statt an eine Textdatei an ein Python-Script senden kann, welches der Anfrage einen künstlichen Textdatei-Stream samt Header (Content-type: text/plain) zurück gibt? Vielleicht über diese StringIO-Dinger? Dann brauch ich das Thema Server und Sockets nicht mehr.

Das Problem wird aber sein, dass das Python-Script wahrscheinlich nicht ausgeführt wird, oder?
Das könntest du höchstens machen wenn du ein Overlay-Dateisystem hast bei dem bei jedem Dateizugriff versucht wird die Datei auszuführen. Aber das wird auch nicht richtig funktionieren weil ja die Skripte irgendeine Eingabe brauchen.

Mir ist deine Ablehnung des eingebauten HTTP-Servers immer noch völlig unklar. Statt da irgendwelche seltsamen Workarounds zu bauen, versuch es doch einfach erstmal auf dem einfachen Weg.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Leonidas hat geschrieben:Mir ist deine Ablehnung des eingebauten HTTP-Servers immer noch völlig unklar. Statt da irgendwelche seltsamen Workarounds zu bauen, versuch es doch einfach erstmal auf dem einfachen Weg.
Ich verstehe eure Auffassung dazu, aber ich möchte recht schnell einen Prototypen mit GUI entwickeln... und GUI-Entwicklung in Python lernt man nicht mal eben schnell. Wenn's nur um ein Fenster mit ein paar Knöpfchen geht ist das kein Problem... aber in meinem Fall wird's schon komplexer. Sprich ich traue mir das in der kurzen Zeit nicht zu.

Ich habe noch was hübsches gefunden: http://www.drweb.de/magazin/html-application-hta/. Kannte ich schon, hab das aber nie in Erwägung gezogen.

Damit kann ich eine GUI in HTML schreiben und habe aber Benutzerrechte und kann auf das Dateisystem zugreifen. Ich kann damit auch Befehle ausführen und auch auf StdOut zugreifen:

Code: Alles auswählen

strTarget = "127.0.0.1"
Set objShell = CreateObject("WScript.Shell")
Set objExec = objShell.Exec("ping -n 2 -w 1000 " & strTarget)
strPingResults = LCase(objExec.StdOut.ReadAll) 
Hier auch noch interessante Beispiele.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich kann dich schon verstehen. GUI Entwicklung ist auch nicht so mein Ding.

Wenn es allerdings schnell gehen soll, dann nimm doch einfach django und den vorhandenen Dev.Server für den Prototypen. Den Port kannst du ja auf > 1024 legen.
Der Dev.Server kann auch statische Dateien ausliefern, was du sicherlich auch brauchen wirst, siehe: http://docs.djangoproject.com/en/dev/ho ... tic-files/

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten