Graphiken adhoc erzeugen, speichern und anzeigen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
pontic
User
Beiträge: 4
Registriert: Montag 20. Februar 2006, 06:13

Hallo zusammen,

habe schon seit einiger Weile ein großes Problem:

Ein Python-cgi-Script soll eine Graphik erzeugen und in eine Datei speichern,
ein neues kleines Browser-Fenster öffnen und diese Grahik anzeigen.

Alles geht, aber ich habe enorme Probleme mit der Aktualisierung.
Es wird immer die Graphik zuvor angezeigt und man muss immer
extra auf "neu laden" im kleinen Graphikfenter gehen, um die neue
Graphik su sehen.
<meta http-equiv="expires" content="0">
bringt leider nichts

Sinn der Sache:
Mittels pydot wird ein Diagramm aus den post daten erzeugt, das dann
schließlich auch angezeigt werden soll.

Wer was dazu weiß, bitte schreiben.
Wäre sehr dankbar
cu, pontic
BlackJack

Die ersten beiden Punkte, Grafik erzeugen und abspeichern kann man mit einem CGI-Skript machen. Aber das Öffnen eines Browserfensters muss man beim Benutzer als im Browser machen, z.B. mit JavaScript.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Warum machst du nicht sowas im HTML-File:

Code: Alles auswählen

<img src='bild.py?param1=test' />
Dann musst du bei bild.py zuerst print 'Content-Type: image/jpg\r\n\r\n' (oder was es auch immer ist) und dann das bild als raw-daten mit print ausgeben.

Somit musst du es auch nicht mehr in eine Datei schreiben, sondern wird jedesmal neu generiert.

Gruss
pontic
User
Beiträge: 4
Registriert: Montag 20. Februar 2006, 06:13

Hallo,
rayo hat geschrieben: Warum machst du nicht sowas im HTML-File:

Code: Alles auswählen

<img src='bild.py?param1=test' />
eneriert.
Yo, hab ich jetzt auch gemacht, allerdings mit php. Das klappt aber
nur, wenn man eine Pause von 1 Sekunde einbaut:

Code: Alles auswählen

<?php
sleep(1);
header("Content-Type: image/gif");
header("Cache-Control: no-store, no-cache, max-age=0, must-revalidate");
readfile("graph.gif");
?> 
Das ist irgendwie blöd mit der sekunde, aber alle Werte darunter
liefern zuerst immer noch das alte Bild. Anscheinend wird das Bild
früher geladen, als es komplett vom cgi-script gespeichert wurde.
Ist das ein Problem von Windows, oder auch unter Unix zu erwarten?
Gut.... is ja eigentlich kein Problem, da ja der Button, der die neue
Graphik laden soll, zeitgleich auch das py-script die Datei erstellen lässt.
Aber ich hatte gefofft, dass der Browser 'merkt', dass die Datei noch nicht
vollständig da ist und entsprechend wartet........

Könnte man da vielleicht noch irgendwas mit dem write-cache machen?
Vielleicht befinden sich die Schreib-Daten erst in einem Cache, den
man deaktivieren könnte.....
Allerdings....wird das schwierig, da die write-Prozedur in pydot bereits
implementiert ist.......

Hat da jemand noch ne Idee?

ciao, pontic
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

rayo hat Dir schon genau den richtigen Tipp gegeben: Mache eine temporäre Datei mit beliebigem Namen (in der Du die Grafik speicherst), und dann lies in dem selben CGI diese Datei ein und gib sie aus. Das ganze kannst Du in einem CGI machen, und wenn Du den Expires-Header richtig setzt wird die Grafik jedes mal neu geladen.

Das funktioniert bei mir wunderbar. Wenn ich mal code dafür posten soll melde Dich.
--- Heiko.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Seh ich das richtig, dass das File vom Cgi-script erstellt wird und dann vom php-Script eingelesen?

Warum erstellt nicht direkt das PHP-Script die Grafik anstatt graph.gif einzulesen?

Gruss
pontic
User
Beiträge: 4
Registriert: Montag 20. Februar 2006, 06:13

Hallo,

ich glaube mein Problem ist:
1. Die Seite mit dem CGI-Script soll immer stehen bleiben (Daten werden eingegeben und verarbeitet, die dann im extra Graphik-Fenster angezeigt werden sollen)
2. Beim Drücken des Absende-Buttons des CGI-Script-Fensters wird *zugleich* das Graphik-Fenster (Stichwort onclick=, Javascript...) mit der noch nicht vorhandenen Graphik geöffnet (oder aktualisiert) UND das CGI-Script mit den neuen Daten verarbeitet und die Graphik geschrieben.

Das kann ja eigentlich nur mit einer leichten Verzögerung seitens des Graphik-Fensters klappen, oder?

@modelnine:
Simmt, wenn man das alles mit der Ausgabe des CGI-Script macht, dürfte man diese Probleme nicht haben. Aber das ursprüngliche Fenster soll ja stehen bleiben, also müsste man mit nem Pop-Up Fenster arbeiten, das sich öffnet, sobald die NEUE CGI-Seite geladen wird.
Automatische Pop-Ups werden aber halt von vielen geblockt.

@rayo:
Ein Algorithmus in Python liefert dazu die Datenbasis, also muss Python auch die Graphik schreiben. Und es sollen ja such beide fenster zu sehen sein, das mit der Eingabe und das mit der Ausgabe-Graphik.

Aber ich versuchs mal mit der Pop-Up-Variante.......
melde mich dann.....

cya, pontic
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Ich glaube du hast mich nicht ganz richtig verstanden, also erklär ichs nochmal ausfühlicher mit Pseudocode:

Hier wird wirklich nur das Formular ausgegeben oder die Formulardaten weiter an graphik.py geschickt (kann natürlich noch zusätzlich augegeben werden)

eingabe.py

Code: Alles auswählen

print "Content-Type: text/html\r\n\r\n"

if formulardaten.gesetzt():
    img = "<img src='graphic.py?eingabe1=%s&eingabe2=%s' alt='generiertes Bild' />"
    print img % (formulardaten.eingabe1,formulardaten.eingabe2)
else:
    print formular
Die Befehle zum Bild erstellen und bearbeiten stimmen natürlich nicht, aber den Code hast du ja in Python schon.

graphik.py

Code: Alles auswählen

print 'Content-Type: image/gif\r\n\r\n'

c = machAlgorithmus(getdaten.eingabe1)
r = machAlgorithmus2(getdaten.eingabe2)

image = createImage(breite, hoehe)
image.fill(color=c)
image.drawCircle(x=breite/2,y=hoehe/2,radius=r)

print image.rawData
Mit dieser Lösung ist das Bild immer aktuell.

gruss Rayo
pontic
User
Beiträge: 4
Registriert: Montag 20. Februar 2006, 06:13

Hallo,

hey vielen Dank, rayo für den ausfühlichen source-code.
Aber auch auf die Gefahr hin, dass Du jetzt verzweifelt den Kopf schüttelst:
Die Graphik in Deinem Beispiel ist doch im gleichen Browser-Fenster wie das Formular, oder? (eingebettet mit img-Tag, das dann eben die Graphik nachläd)
Ich dachte aber eigentlich an ein getrenntes Fenster, das sich beim abschicken öffnet.
Aber trotzdem vielen Dank, ich denk' ich werd mich da schon 'durchbeißen', eure posts haben mir jedenfalls sehr geholfen.....

ciao, pontic
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Das könntest du ein wenig erweitern.

formular.py -> formulardaten auswerten und zwischenspeichern (kein Algorithmus laufen lassen, nur validierung), am schluss mit Javascript oder so ein neues Fenster öffnen (anzeige.py)

anzeige.py -> nur <img src='graphic.py' /> und zusätzliche Ausgaben, die du willst

graphic.py -> Bildgenerierung mit Algorithmus

Aber wenn dus anders gelöst hast ist schon ok, nur so würde ich es glaubs lösen.

Gruss
Antworten