CGI Script und HTML redirect?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
ne0h
User
Beiträge: 115
Registriert: Samstag 16. Februar 2008, 11:35

Hi,

ich habe da noch ein kleines Verständnisproblem zu CGI Scripten und der Ausgabe.

Also, ich habe ein einfaches CGI Script, z.B.:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding:utf-8 -*-

print "Content-Type: text/plain;charset=utf-8;\n"
print

import cgi

fs = cgi.FieldStorage()

print "Dein Name ist: %s" % (fs.getvalue("Vorname"), )


Dazu habe ich auf einer beliebigen HTML Seite folgendes Formular:

Code: Alles auswählen

<form action="/Pfad zu meinem Script/auswertung.py" method="get">
	<input type="text" name="Vorname" maxlength="20" size="30" value="" />
	<input type="submit" value="Abschicken" />
</form>

Schicke ich das Script nun ab, dann bekomme ich meine Auswertung ja erstmal nur auf einer neuen Seite, in reinem Textformat. Was ja auch Ok ist. Nun will ich aber, dass mein Ergebnis in einer HTML Datei steht, und zwar in einer bereits fertigen Datei, z.B. in meiner "index.html".

Ich habe versucht, es mittels SSI zu machen und das Script so einzufügen:

Code: Alles auswählen

<!--#include virtual="/Pfad zum Script/auswertung.py" --> 
Dieser Weg klappt zwar, aber nicht so wie ich es will. Erstmal steht der fertige Text die ganze Zeit in meiner HTML Datei und dazu wird die Seite ja nicht neu aufgerufen nach dem Abschicken des Scripts. Also öffnet sich wieder nur meine neue Seite mit dem reinen Text.

Nun würde ja auch noch die Möglichkeit bestehen, dass ich meine komplette HTML Seite mit Python generiere. Also einfach ein CGI Script, in welches ich dann sowas hier schreibe:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding:utf-8 -*-

print "Content-Type: text/html;charset=utf-8;\n"
print

import cgi

fs = cgi.FieldStorage()
vorname = fs.getvalue("Vorname")

print """

Hier den kompletten HTML Code, z.B. 

Dein Name ist: <b>%s</b>

"""
% (vorname, )



Aber mir scheint das nicht der geeignete Weg, da ich es etwas zu "viel" finde. Oder besser gesagt:

Ich möchte, dass mein CGI Script einfach nur reinen text enthält und die Funktionalität zum Auslesen meiner Formulare. Die Ergebnisse möchte ich dann direkt in eine HTML Datei umleiten, also in der Art wie ich es mit dem "include virtual"-Tag mache, nur eben mit den einzelnen Werten und auch nur dann, wenn das Script aufgerufen wird.


Ist das so überhaupt möglich in Python (ohne ein Framework und ohne PSP) ? Oder muss ich letzten Endes doch ganze HTML Seiten generieren?


Gruß

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

Nutz doch einfach eine Template-Engine. Nicht das Python mit Jinja, Mako, Genshi etc. nicht ausreichend viele brauchbare hätte.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
ne0h
User
Beiträge: 115
Registriert: Samstag 16. Februar 2008, 11:35

Hallo Leonidas,

dazu müsste ich doch auf den Server kommen und die nötigen Dateien einspielen, oder? Denn auf den Server habe ich so keinerlei Zugriff, ich habe nur ein eigenes Home Verzeichnis für meine HTML und CGI Dateien.

Übrigens: Jetzt habe ich mal probiert, eine HTML Seite mit Python generieren zu lassen.

Es klappt einigermaßen, nur:

Die neu generierte Seite erkennt meine CSS Datei nicht? :?

Alle anderen Seiten funktionieren einwandfrei, überall wird der Pfad zum Stylesheet erkannt. Nur in der generierten Seite habe ich reines, unformatiertes HTML.

Gibts da irgendeinen bekannten Bug oder muss ich da etwas besonderes beachten? Der Pfad zur CSS Datei ist auch in Ordnung, ich habe es jetzt mehrmals geprüft.


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

ne0h hat geschrieben:dazu müsste ich doch auf den Server kommen und die nötigen Dateien einspielen, oder? Denn auf den Server habe ich so keinerlei Zugriff, ich habe nur ein eigenes Home Verzeichnis für meine HTML und CGI Dateien.
Ein Python-Package lokal ohne Installation laufen zu lassen ist keinerlei Problem. Also reicht es schon wenn du es hochlädst, so dass es in ``sys.path`` gefunden wird.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

@ne0h: Hast du die CSS Datei mit einer absoluten URL angegeben?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
ne0h
User
Beiträge: 115
Registriert: Samstag 16. Februar 2008, 11:35

@jens

Hi, ja genau darauf bin ich heute auch im Unterricht gekommen, als ich dran rumgewerkelt habe. :wink:

Danke trotzdem!


@Leonidas

Hi,

ich habe heute mit meinem Tutor kurz gequatscht und Ihn gefragt, ob ich in meinen Space ein lokales Python installieren kann um dies dann auch mit Templates zu erweitern.

Er meinte, dass ich in mein lokales Verzeichnis kein Python installieren darf (habs probiert, wurde tatsächlich gesperrt, ich bekam ne Meldung: "Installation nicht erlaubt").

Heisst: ich dackel morgen mal zum IT Support und bettel rum, dass die mir Python 2.5.2 und evtl. auch gleich ein Templatesystem aufspielen.

Falls das nicht klappt, denke ich nun doch ernsthaft drüber nach, mir eigenen Space zu kaufen, für paar Euro im Monat.

Hat da viell. Jemand auch paar gute, seriöse und zuverlässige Hoster mit Python?


Gruß

ne0h
ne0h
User
Beiträge: 115
Registriert: Samstag 16. Februar 2008, 11:35

Sorry,

vergesst den letzen Teil. Ich habe gerade den Thread hier gesehen mit einer Übersicht guter Hoster.

Werde ich mir durchlesen.

ne0h
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

ne0h hat geschrieben: ich habe heute mit meinem Tutor kurz gequatscht und Ihn gefragt, ob ich in meinen Space ein lokales Python installieren kann um dies dann auch mit Templates zu erweitern.
Du musst ja auch nicht ein komplettes Python installieren, sondern nur das benötigte fehlende Paket! In dem Falle also Jinja o.ä. Sprich Dateien hochladen und dann mit sys.path.append() hantieren. (Oder gibt es da noch einen anderen Weg?)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hyperion hat geschrieben:Du musst ja auch nicht ein komplettes Python installieren, sondern nur das benötigte fehlende Paket! In dem Falle also Jinja o.ä. Sprich Dateien hochladen und dann mit sys.path.append() hantieren. (Oder gibt es da noch einen anderen Weg?)
Ja, sofern die Python-Verion nicht zu alt ist. Man kann das Package auch im aktuellen Ordner liegen haben, dann muss man mit sys.path nichts machen. Als Alternative gibt es natürlich ##pyhosting.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Wie in einem anderen Thread schon erwähnt, geht oft auch eine lokale [wiki]SSH installation[/wiki]

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Einen Redirect kannst du über den "Location"-Header machen. Wenn du aber Ergebnisdaten sauber und evtl. auch fälschungssicher anzeigen möchtest, solltest du das nicht über (URL-)Parameter tun, sondern die Ergebnisseite ebenfalls dynamisch erzeugen lassen. Dazu eigenen sich dann die von Leonidas genanntes Template Engines - zur Not geht es natürlich auch mit `print`, wird aber sehr schnell sehr müßig.
ne0h
User
Beiträge: 115
Registriert: Samstag 16. Februar 2008, 11:35

Hallo,

also, mit Upgrade auf ne neuere Pythonversion geht da nix, die aktuelle Version war auch nur zu Übungszwecken aufgespielt. Wie gesagt, ich werde mir jetzt einen guten Hoster suchen und demnächst mal dorthin umziehen.

Bis dahin teste ich noch ein wenig herum.

Das mit den Templates werde ich dann auch erst auf dem neuen Hoster ins Spiel bringen und mich damit auseinandersetzen.

Ich werde meine HTML-Seiten, wie Y0Gi es schon schreibt, weiter dynamisch mit Python erzeugen, ich werde die Seite nicht mehr ausbauen und einfach einige Funktionalitäten ausprobieren.

Aber dann noch eine Frage:

Warum funktioniert der angesprochene Redirect mittels "Location" nicht?

Ich hatte in meinem Script den Aufruf:

Code: Alles auswählen

print "Location: http://irgendeineseite.html\n\n"
stehen, aber das einzige was passiert ist, war dass eine leere HTML Seite generiert wurde mit eben dem Text (Location: http://irgendeineseite.html\n\n) ganz oben....


:?:


ne0h
ne0h
User
Beiträge: 115
Registriert: Samstag 16. Februar 2008, 11:35

Oh, da wird aus dem String wohl ein Link generiert.

Na ja, aber Ihr versteht schon. Das in den Klammern ist halt nur der Text der HTML Seite.


ne0h
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Weil's keine vollständige URL ist. Natürlich sofern du keinen Host namens "irgendeineseite.html" im LAN hast ;)

Es ist möglich, Location-Ziele nur als URL-Pfad (z.B. `/irgendeineseite.html`) anzugeben, also relativ zum aktuellen Host. Laut RFC *sollten* sie absolut sein. Im Zusammenhang damit bin ich mit SCGI/`mod_scgi` mal böse auf die Nase gefallen.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich tippe ehr darauf, das zuerst der Header mit print "Content-Type: text/html;charset=utf-8;\n" Ausgegeben wurde. Dann klappt es natürlich nicht ;)

@ne0h: Diese Zeilen kennst du schon?

Code: Alles auswählen

# Debugging für CGI-Skripte 'einschalten'
import cgitb; cgitb.enable()

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

jens hat geschrieben:Ich tippe ehr darauf, das zuerst der Header mit print "Content-Type: text/html;charset=utf-8;\n" Ausgegeben wurde. Dann klappt es natürlich nicht ;)
Oh ja, ich hatte seinen letzten Satz irgendwie übersehen.
ne0h
User
Beiträge: 115
Registriert: Samstag 16. Februar 2008, 11:35

@ne0h: Diese Zeilen kennst du schon?

Code: Alles auswählen

# Debugging für CGI-Skripte 'einschalten'
import cgitb; cgitb.enable()
Ja, die Bedeutung kenne ich inzwischen. Nur: wie bzw. wo erhalte ich meine Ausgabe bei Fehlern? Bin da grade etwas durcheinander.


Na ja, momentan löse ich das ganze mit reinenm HTML oder mit SSI bzw. druch CGI generierten Seiten.


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

ne0h hat geschrieben:Nur: wie bzw. wo erhalte ich meine Ausgabe bei Fehlern?
Bei Exceptions / im Browser. Jetzt mal kurz zusammengefasst.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
ne0h
User
Beiträge: 115
Registriert: Samstag 16. Februar 2008, 11:35

Mhm...

genau da sehe ich nichts, ausser "SERVER ERROR 500".

:?


ne0h
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Lange nicht benutzt, aber ich hatte immer `cgitb.enable(display=1)` gesetzt - vielleicht macht das den Unterschied. Im Browser sollte dann ein bunter Traceback (unsicher, nicht öffentlich benutzen!) erscheinen, bei `display=0` nur ein "An error occured in a Python script.", auf dem selben rosa-ähnlichen Hintergrund.

OK, aber "Server Error 500" klingt irgendwie nach Fehlkonfiguration. Fehler im Script oder fehlender Import (wobei `cgitb` iirc schon lange dabei sein dürfte).
Antworten