Bild und Text auf Webseite dynamisch anzeigen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
py_lo
User
Beiträge: 60
Registriert: Freitag 20. März 2009, 09:12

Hallo,

bitte nicht gleich steinigen aber ich habe gerade erst angefangen mich mit
Python und Internet so richtig auseinander zu setzen.

Ich möchte gerne eine Html-Seite erstellen, die praktisch ein graphisches
Frontend für meinen Mediaplayer unter Linux darstellen soll.

Dazu soll erstmal einfach ein Bild(Cover) ein ein paar weitere Informationen über den gerade gespielten Titel angezeigt werden.
Soweit kaum ein Problem, ich weiss jedoch nicht wie ich es zu bewerkstelligen
habe das der Browser die entsprechenden Daten automatisch aktualisiert.

Ich könnte natürlich die Gesammte Seite alle X-Sekunden neu laden- das möchte ich
aber nicht weil 1. Unschön und 2. Unnötig viel Traffic.
Also am liebsten sollen nur die "Daten / Bild" aktualisiert werden.

Ich verlage jetzt keine fertige Lösung- aber vielleicht kann mir ja jmd.
ein wenig auf die Sprünge helfen.
- Fürchte ich komme da ohne Java wohl nicht aus - oder?

Gruß
Py_lo
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Also mir fällt zum dynamischen Laden von einzelnen Elementen einer HTML-Seite spontan nur AJAX ein.
Das hat allerdings nichts mit Java sondern mit JavaScript zu tun (streng betrachtet haben die zwei außer der Syntax nichts gemeinsam).

Was das ganze jetzt mit Python zu tun haben will, ist mir irgendwie unklar.

Edit: VLC hat für seinen Player außerdem schon solch ein Web-Frontend entwickelt (falls es dir nur um die Lösung und nicht um das Programmieren geht).
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

py_lo hat geschrieben:- Fürchte ich komme da ohne Java wohl nicht aus - oder?
Hmm? Wo willst du da Java verwenden?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
py_lo
User
Beiträge: 60
Registriert: Freitag 20. März 2009, 09:12

Ja, hast recht - javaSCRIPT.
Mir ging es nur darum welche Möglichkeiten überhaupt bestehen, naja den
Webserver habe ich ja mit Python realisiert insofern hat es damit schon etwas
zu tun.

Es hätte ja sein können das mein Vorhaben auch irgendwie mit Python zu lösen ist.
Ajax werd ich mir mal genauer ansehen, danke dafür.
Und ja, es geht mir eher um die Herausfoderung, als um die fertige Lösung :wink:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Letztendlich kommst du an Spielereien mit AJAX nicht herum. Du könntest etwa COMET verwenden, zusammen mit Nevow um damit dem Browser Events zu schicken ("neuer Track, schau, hier ist das Cover").
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo py_lo!

Ganz so schlimm ist das mit dem AJAX dann doch nicht. :-)

- jQuery: http://jquery.com/
- jQuery AJAX: http://docs.jquery.com/Ajax

Kleines Beispiel: http://halvar.at/krimskrams3/ajaxtest.zip

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
py_lo
User
Beiträge: 60
Registriert: Freitag 20. März 2009, 09:12

So ich muss das Beispiel von Gerold nochmal eben aufgreifen...

Wenn ich mit cherrypy auf localhost (127.0.0.1:8080) einen Server laufen
habe (gerne genau Dein Beispiel) - was brauche ich dann um von einem entfernten Rechner die Seite aufzurufen.

Ich dachte ein einfaches IPDESRECHNERS:8080 würds tun, dem ist aber
nicht so. Muss da noch zusätzlich ein Webserver im Hintergund werkeln,
ich dachte cherrypy hat einen solchen mit drin?

:?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Du musst ihn auf die IP 0.0.0.0 stellen und nicht auf 127.0.0.1, weil da nimmt er nur lokale Verbindungen entgegen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
py_lo
User
Beiträge: 60
Registriert: Freitag 20. März 2009, 09:12

Yup:
cherrypy.config.update({'server.socket_host': '0.0.0.0','server.socket_port': 8080})
hat geholfen.... Dankeschöön.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

py_lo hat geschrieben:Yup:
cherrypy.config.update({'server.socket_host': '0.0.0.0','server.socket_port': 8080})
hat geholfen.... Dankeschöön.
Hallo py_lo!

Du kannst diese Informationen auch in die zugehörige INI-Schreiben. Z.B. so:

Code: Alles auswählen

[global]
server.socket_port = 80
server.socket_host = "0.0.0.0"
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
py_lo
User
Beiträge: 60
Registriert: Freitag 20. März 2009, 09:12

Hallo gerold,

genau das klappt ja eben irgendwie nicht - hatte ich vorher auch
schon mit rumgespielt, ich weiss auch nicht warum.

In dem konkreten Beispiel ist ja die Datei ajaxtest_server.ini.
Nunja so geht es ja auch.

Allerdings habe ich da schon wieder eine Frage, wollte kein neues Thema erstellen weil es zu diesem Beispiel gehört.

Ich habe eine sqlite Datenbank und wollte diese mit einbinden, nutze
also pysqlite. Funktioniert Prima, allerdings würde ich gerne eine Funktion
definieren die Ergebnisse des Methodenaufrufs "execSQL" zurückgibt.

So sieht das ja im Original aus:

Code: Alles auswählen

# ....
    def get_data(self, *args, **kwargs):
        """
        Handler für http://localddhost:8080/get_data
        """
        return unicode(time.asctime())
    get_data.exposed = True
# ...
Nun möchte ich aber z.B. das Ergebnis von:
execSQL(DbCmd(SqlCmd, [("select * from irgenwas", ())]))
zurückgeben.

Return XXX erwartet aber einen String, und logischerweise erhalte ich
beim obingen Aufruf eine Tupel.

Klar das das also nicht funktionieren kann. Ich möchte einfach ohne einen
SQL-Server zu installieren die DB-Anfragen in Python verabeiten und die Ergebnisse zurück an die aufrufende Funktion übergeben.

Ausgehend vom dem Beispiel: http://halvar.at/krimskrams3/ajaxtest.zip

Sicherlich denke ich wieder mal zu kompliziert, aber ich hoffe ihr versteht was ich vorhabe.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo py_lo!
py_lo hat geschrieben:genau das klappt ja eben irgendwie nicht - hatte ich vorher auch schon mit rumgespielt, ich weiss auch nicht warum.
Das kann ich erklären. Es gibt einstellungen für die **Anwendung** und für den **Server**. Ein Server kann mehrere Anwendungen zur Verfügung stellen.

Im ersten Beispiel wurden die INI-Einstellungen nur der Anwendung zugewiesen. Im folgenden Beispiel, werden die Einstellungen nun auch dem Server zugewiesen. Dann funktioniert das auch mit der INI.

py_lo hat geschrieben:Ich habe eine sqlite Datenbank und wollte diese mit einbinden
[...]
execSQL(DbCmd(SqlCmd, [("select * from irgenwas", ())]))
Irgendwie kompliziert, dein Konstrukt. :-|

Neue INI-Datei (ajaxtest_server.ini): http://paste.pocoo.org/show/142679/

Jetzt horcht der Server an allen Adressen des Computers.

Neue JavaScript-Datei (index.js): http://paste.pocoo.org/show/142678/

Das JavaScript ist jetzt so geschrieben, dass es nur einmal (nach dem Laden der Seite) die Daten aktualisiert. Wie es anders läuft, weißt du ja schon vom alten Beispiel.
Das Skript bekommt die Daten als JSON-String übermittelt. jQuery macht daraus gültige JavaScript-Objekte.
Per jQuery werden DIVs erstellt, in denen die Daten angezeigt werden. Die DIVs können wie üblich per CSS oder auch direkt per JavaScript formatiert werden.

Neues Python-Modul (ajaxtest_server.py): http://paste.pocoo.org/show/142682/

Der Datenbankzugriff ist nicht ausgeklügelt, aber ich wollte nicht auch noch "yield" und Dict-Cursors ins Spiel bringen. Die Daten werden als JSON-String vom Server zum Browser übermittelt.

mfg
Gerold
:-)

Gezipptes Gesamtprojekt: http://halvar.at/krimskrams3/ajaxtest_v2.zip

.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
py_lo
User
Beiträge: 60
Registriert: Freitag 20. März 2009, 09:12

Super! Vielen Dank gerold.

Dann wär das mit der ini auch geklärt.

Ich werd mir das jetzt erstmal in Ruhe zur Gemüte führen - ich geb mir auch mühe alles zu verstehen damit ich nicht wieder blöd fragen muss :wink:
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

py_lo hat geschrieben:damit ich nicht wieder blöd fragen muss
Hättest du "blöd" gefragt, dann hättest du von mir wahrscheinlich keine Antwort bekommen. :-)
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:

Hallo py_lo!

Noch ein Wort...
gerold hat geschrieben:Der Datenbankzugriff ist nicht ausgeklügelt
Zu beachten: Du bekommst eine Exception von SQLite zurück geliefert, wenn der Schreibzugriff gesperrt wurde. Auf diese Exception musst du selber reagieren. Das heißt, dass du bei Schreibzugriffen diese Exception abfangen und es kurz darauf noch einmal versuchen solltest. Ein konkretes Beispiel kann ich nicht liefern, da ich keine Webprojekte mit SQLite mache.

Wenn du später einmal eine Anwendung für mehr als nur eine Person schreiben möchtest, dann solltest du zu einem Datenbanksystem wie z.B. PostgreSQL über gehen. Solche Datenbanksysteme regeln diese konkurrierenden Zugriffe besser als so eine einfache Datenbank wie SQLite.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
py_lo
User
Beiträge: 60
Registriert: Freitag 20. März 2009, 09:12

Hallo Gerold,

das Problem mit dem Schreibzugriff werde ich nicht haben, da ich
ausschließlich lesend auf die Datenbank zugreife -das vereinfacht auf jeden Fall schonmal ganz schön :mrgreen:

Aber danke für die Tipps - PostgreSQL kenn ich (noch) nicht, werd mich aber erstmal intensiver mit jQuery auseinandersetzen -sieht interessant aus.
Ich bin froh wenn ich erstmal die einfache Datenbank im Griff habe.

Also bis später...

Gruß
Normann
py_lo
User
Beiträge: 60
Registriert: Freitag 20. März 2009, 09:12

Wenn ich jetzt aus dem JavaScript heraus eine Python-Funktion aufrufe (mpg_ctl), so wie in dem Beispiel ja auch -
wie kann ich denn da Parameter mit übergeben.

#Ausschnitt .js:
$.getJSON("mpg_ctl", function(data) {
...
py_lo
User
Beiträge: 60
Registriert: Freitag 20. März 2009, 09:12

Hi,

naja so scheint es erstmal zu gehen:

$.getJSON("get_data",{ option: 'test', option2: null }, function(data) {
...

Code: Alles auswählen

def get_data(self, *args, **kwargs):
   for option in kwargs:
   #Mach was tolles
get_data.exposed = True
py_lo
User
Beiträge: 60
Registriert: Freitag 20. März 2009, 09:12

Hallo,

was mich noch brennend interessiert:
gibt es in diesem Zusammenhang auch irgend eine Möglichkeit eine Java funktion von Python heraus aufzurufen,
oder geht nur der umgekehrte weg?


schönen Gruß
Normann
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

py_lo hat geschrieben:eine Möglichkeit eine Java funktion von Python heraus aufzurufen
Java? Oder JavaScript?
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten