CGI wird nur als Text ausgegeben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
samid
User
Beiträge: 60
Registriert: Samstag 28. April 2012, 08:40

Hallo zusammen,

bin gerade dabei das Buch "Einstieg in Python" durch zu machen. Jetzt komme ich aber bei einem Kapitel nicht weiter. Es geht um cgi's. Zuerst wird eine HTML Datei mit zwei Feldern und einem Button aufgebaut und unter ...\xampp\htdocs\python32\ abgelegt. In dieser HTML Datei wird ein cgi script aus dem Verzeichnis \xampp\cgi-bin\python32\ angesprochen. Komischerweise wird das cgi script nicht ausgeführt und es kommt nur lediglich der ganze code von diesem cgi im Browser. Ich weiß nicht wieso das passiert. Der Xampp server läuft, in der cfg datei von xampp habe ich nach kurzem Duchfliegen auch nichts auffälliges gefunden. Kennt jemand dieses Problem? Wenn ja, wie kann dieses gelöst werden?

Danke für die Antworten.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Vermutlich weil der Webserver nicht konfiguriert ist CGI auszuführen. Aber machs dir doch einfacher und vergiss CGI, das nutzt seit fast 10 Jahren keiner mehr und hol dir ein ordentliches Webframework wie Django. Das kommt dann auch mit eingebautem (Entwicklungs-)Webserver, da brauchst du diese XAMP-Krücke nicht mehr.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
samid
User
Beiträge: 60
Registriert: Samstag 28. April 2012, 08:40

Guten Morgen,

ja darauf will ich ja hinaus. Aber ich will doch das ganz Buch durch machen.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Du willst doch Python lernen, oder?
Warum brauchst du dafür ein Kapitel über CGI-Programmierung, was in dieser Form seit Jahren niemand mehr macht? Wenn du versuchst das Kapitel wirklich "nachzuarbeiten", wirst du mehr Zeit damit verbringen einen Webserver aufzusetzen und einzurichten als wirklich Python zu lernen.
Wenn du die Grundlagen von Python verstanden hast, wird es einfach für dich sein ein Framework wir Django einzusetzen. Dann wirst du über dieses krude Zeug nur noch den Kopf schütteln.
BlackJack

Python-Bücher aus dem Verlag sind sowieso anscheinend nur mit etwas Vorsicht zu geniessen. Dieses verwendet zum Beispiel auch in der Python 3-Auflage immer noch das `thread`-Modul was schon seit einer Ewigkeit in der Dokumentation auf das `threading`-Modul verweist. In Python 3 heisst das Modul nun nicht mehr `thread` sondern `_thread` was endgültig klar machen sollte, dass man das nicht mehr benutzen sollte, weil Namen mit einem führenden Unterstrich aussagen „Halt! Das ist was internes, keine öffentliche API”.

Wenn man dann bei der Überarbeitung einen Hinweis auf die Umbenennung von Python 2 nach 3 schreiben kann, statt das Beispiel einfach mal auf `threading` umzustellen, was echt kein Problem darstellen sollte, dann ist das IMHO schon erschreckend. Das Beispielprogramm was dann von zwei Threads aus eine globale Variable verändert finde ich auch gruselig wegen dem ``global``. Vielleicht gehe ich da ja zu weit, aber ich finde man sollte die Anweisung in einem Anfängerbuch gar nicht erst erwähnen, geschweige denn verwenden, denn das verführt dazu sie auch in echten Programmen zu verwenden, wenn man sich keine Gedanken machen kann oder will wie man einen ordentlichen Datenfluss hinbekommt.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ein sehr populärer Fehler bei Python CGI-Skripten ist eine fehlende Leerzeile bzw. ein fehlendes print-statement, was eine Leerzeile erzeugt. Zeig' doch mal deinen Code.

Ansonsten brauch man heute Python+CGI noch in den seltsten Fällen... WSGI ist Stand der Dinge. Das aber noch nicht roh, sondern über ein Framework wie Bottle oder Flask. Oder direkt ein all-in-one Paket a la Django.

Gruß, noisefloor
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

noisefloor hat geschrieben:Ansonsten brauch man heute Python+CGI noch in den seltsten Fällen... WSGI ist Stand der Dinge. Das aber noch nicht roh, sondern über ein Framework wie Bottle oder Flask. Oder direkt ein all-in-one Paket a la Django.
Wobei sich cgi und wgsi nicht ausschließen. wsgi läuft nämlich auch unter cgi, wenn es sein muss. cgi ist nicht per se schlecht. Es ist halt nur langsam weil bei jeder Anfrage der ganze Interpreter gestartet werden muss.

@samid: Das kann viele Ursachen haben. Sind die Dateien als ausführbar markiert? Enden sie auf .cgi? Ansonsten kann ich mich dem Rest anschließen, beschäftige dich nicht mit low-level cgi-Programmierung das ist Zeitverschwendung.
samid
User
Beiträge: 60
Registriert: Samstag 28. April 2012, 08:40

Hallo zusammen,

danke für die Atworten!

Eigentlich ist Django der Grund wieso ich Python lernen will. Nun ist es aber so, dass der spätere Buchverlauf auf der ganzen CGI Thematik aufbaut. Und ich möchte wirklich das Buch komplett durcharbeiten, schließlich habe ich dafür auch Geld bezahlt. Als nächstes kommt dann das Buch "Python von Kopf bis Fuß". Jetzt sagt nicht, dass dieses Buch auch ein Mist ist ;-). Ok, also ausschliessen kann ich Abspeicherungsfehler, d.h. das cgi Script ist unter xampp/cgi-bin/Python32/ *.cgi abgespeichert. Hier folgt der HTML Code:

Code: Alles auswählen

<html>
<body>
<b>Bitte senden Sie Ihre Daten:</b><p>

<form action="../../cgi-bin/Python32/server_antworten.cgi">
<input name="nn"> Nachname<p>
<input name="vn"> Vorname<p>
<input type="submit">
</form>

</body>
</html>
Das CGI Script ist wie folgt aufgebaut:

Code: Alles auswählen

#!C:/Python32/python.exe

#Modul cgi
import cgi, cgitb
#Ausgabe bei Fehler
cgitb.enable()

#Objekt der Klasse FieldStorage
form = cgi.FieldStorage()

#Einzelne Elemente des Objekts
if "nn" in form:
    nn = form["nn"].value
if "vn" in form:
    vn = form["vn"].value

#HTML - Dokument mit Variablen
print("Content-type: text/html")
print()
print("<html>")
print("<body>")

print("<p><b>Registrierte Daten:</b></p>")
print("<p>Nachname:", nn, "</p>")
print("<p>Vorname:", vn, "</p>")

print("</body>")
print("</html>")
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Vermutlich ist irgendwas mit deiner Apache-Konfiguration falsch, etwa ExecCGI nicht gesetzt oder sowas. Alternativ kannst du einfach den Python CGI-Server starten, geht unter Python 3 mit ``python -m http.server --cgi 8000`` und dann werden alle Dateien im Unterordner ``cgi-bin`` als CGI-Skripte ausgeführt.
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:

Auf http://wiki.python.de/Web-Skripte%20zum ... %20bringen gibt es eine "Liste der möglichen Ursachen" die man abarbeiten kann. Dabei sind viele Punkte auch für andere Schnittstellen als CGI relevant.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
samid
User
Beiträge: 60
Registriert: Samstag 28. April 2012, 08:40

Ich glaube ich weiß an was es hängt. Wenn ich in der HTML Datei den Pfad von "../../cgi-bin/...." auf "http://localhost/cgi-bin/..... ändere, dann funktioniert es.
Antworten