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

Sonntag 1. Juni 2008, 20:52

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 1. Juni 2008, 21:15

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 Modvoice
ne0h
User
Beiträge: 115
Registriert: Samstag 16. Februar 2008, 11:35

Sonntag 1. Juni 2008, 21:40

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 1. Juni 2008, 22:25

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 Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 2. Juni 2008, 08:29

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

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
ne0h
User
Beiträge: 115
Registriert: Samstag 16. Februar 2008, 11:35

Montag 2. Juni 2008, 19:52

@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

Montag 2. Juni 2008, 20:05

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: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dienstag 3. Juni 2008, 07:42

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 3. Juni 2008, 10:02

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 Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 3. Juni 2008, 10:47

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

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

Dienstag 3. Juni 2008, 11:09

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

Dienstag 3. Juni 2008, 17:42

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

Dienstag 3. Juni 2008, 17:45

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

Dienstag 3. Juni 2008, 18:38

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
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 4. Juni 2008, 07:31

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()

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten