Forum: PC-Programmierung cgi gibt kein html aus


von Matthias (Gast)


Lesenswert?

Morgen.

Einem CGIscript werden von einem HTMLFormular Daten submitted. Werden 
erfolgreich vom script verarbeitet und anschließend wird ein einfacher 
HTMLTeil ausgegeben. Um Letzteren geht es mir hier.

Lokal funktioniert alles wie es soll mit dem laufenden Apache.

Auf meinem Server bei 1&1 ist cgi aktiviert und andere CGISkripte laufen 
reibungslos.

Das was lokal funktioniert ist hier aber Essig. Die submitteten Daten 
werden erfolgreich verarbeitet, nur der HTMLTeil wird nicht angezeigt.

print("Content-type: text/html\n\n")

...

t_file = open('t.txt','a+', encoding='utf-8')
t_file.write(u"<div>")
t_file.write(u"</div>\n")
t_file.close()

print("<html>")
print("<body>")
print("<p>Übertragung erfolgreich</p>")
print("</body>")
print("</html>")

Habe keine Erklärung. Hat jemand einen Hint oder sagt das jemandem 
etwas?
Wieso wird der obere Teil abgearbeitet, aber der HTMLPart nicht?

von PittyJ (Gast)


Lesenswert?

Keine Schreibrechte?

von Matthias (Gast)


Lesenswert?

Das Skript läuft unter 755 Rechten, dass sollte also klappen.

von Hugo (Gast)


Lesenswert?

und was sagen die Log's

von Dr. Sommer (Gast)


Lesenswert?

Fehler in Zeile 42.

von Hugo (Gast)


Lesenswert?

Perfekt dann haben wir den Fehler für den TO gefunden:
'File does not exist: home...'

von Matthias (Gast)


Lesenswert?

>Fehler in Zeile 42??

Wo siehst Du eine Zeile 42?

>'File does not exist: home...'

Wie kommst Du darauf?

von npn (Gast)


Lesenswert?


von Matthias (Gast)


Lesenswert?

Sehr witzig...

von DPA (Gast)


Lesenswert?

Matthias schrieb:
> print("Content-type: text/html\n\n")

Offizielles Zeilenende von HTTP Headern ist \r\n, nicht \n\n

Und stelle sicher das nach den headern ein weiteres \r\n ausgegeben 
wird.

von Dr. Sommer (Gast)


Lesenswert?

Matthias schrieb:
> Wo siehst Du eine Zeile 42?

Nirgendwo. Das ist der Witz. Weil kein Quelltext zu sehen ist. Und somit 
niemand die Frage beantworten kann.

von Matthias (Gast)


Lesenswert?

@DPA

Habe mich bei dem \n\n  nur an der Anleitung auf selfhtml orientiert. 
Werde es nachher mal ausprobieren, Danke.

von Mario M. (thelonging)


Lesenswert?

Das Beispiel auf SelfHtml ist in Perl geschrieben, da ist print 
"Content-type: text/html\n\n"; richtig. Du nutzt aber Python(?), da muss 
es lauten:

print("Content-type: text/html")
print()

von bluppdidupp (Gast)


Lesenswert?

> Content-type: text/html\n\n
Ist nicht richtig - Es müsste eigentlich eher
>Content-type: text/html\r\n\r\n
sein.

RFC2616 definiert CRLF ("\r\n"), nicht LF ("\n") für die Header - 
allerdings funktioniert es meist trotzdem wegen:
"The line terminator for message-header fields is the sequence CRLF. 
However, we recommend that applications, when parsing such headers, 
recognize a single LF as a line terminator and ignore the leading CR."

von Stefan F. (Gast)


Lesenswert?

Ich hatte es mal mit \n\n probiert und das funktionierte bei meinen 
Browsern (Chrome, Firefox) nicht. Mit \r\n\r\n geht es aber.

von Matthias (Gast)


Lesenswert?

Mario M. schrieb:
>print("Content-type: text/html")


bluppdidupp schrieb:
>print("Content-type: text/html\r\n")
optional wg. RFC2616 (so interpretiere ich das)


Stefanus F. schrieb:
>print("Content-type: text/html\r\n\r\n")


Danke für die zahlreichen Hinweise.

Das Problem bleibt aber nach wie vor. Mit den obigen Headern läuft 
leider garnichts. Und nocheinmal, wie bereits geschrieben. Was mich 
wundert ist der Umstand, dass andere CGISkripte mit dem Header 
print("Content-type: text/html\n\n") funktionieren.

Auch bei besagtem Skript wird der erste, in Python3 geschriebene Teil, 
ja abgearbeitet. Nur eben nicht die HTMLAusgabe. Das ist das, was ich 
mir nicht erklären kann.

von andreasgf (Gast)


Lesenswert?

Hugo schrieb:
> und was sagen die Log's

und steht etwas in den Log's ?

Die Antwort fehlt immernoch !

von Matthias (Gast)


Lesenswert?

print("Content-type: text/html\r\n\r\n") macht das gleiche wie mein 
ursprünglicher Header \n\n. Sry, habe mich gerade vertan. But 
Python3Part yes, HTMLPart no.

von Stefan F. (Gast)


Lesenswert?

Wie genau sieht denn der komplette Output wirklich aus, den dein Script 
erzeugt?

von Dirk B. (dirkb2)


Lesenswert?

Das print von Python gibt automatisch ein '\n' am Ende mit aus (wenn du 
das nicht verhinderst)
Das print von perl macht das nicht.

Demnach hat deine html-Ausgabe text/html\r\n\r\n\n

Evtl stört das letzte \n

von Matthias (Gast)


Lesenswert?

Die Information der error.log  habe ich nicht vergessen. Das Problem, es 
wird gar keine angelegt. Der 1&1-Support war heute Nachmittag irgendwie 
überfordert und prüft noch worin der Fehler liegt. Sobald ich eine 
error.log habe, werde ich das prüfen.

von Matthias (Gast)


Lesenswert?

Dirk B. schrieb:
>Evtl stört das letzte \n

Habe ich probiert, unverändertes Ergebnis.

von Mario M. (thelonging)


Lesenswert?

Matthias schrieb:
> Habe ich probiert, unverändertes Ergebnis.

Dann bricht Dein Script bei dem t_file Teil ab und der Teil mit der 
Ausgabe wird nicht mehr ausgeführt. Wahscheinlich stimmt der Pfad nicht 
bzw. es gibt kein Schreibrecht.
Setze mal folgenden Code an den Anfang des Scriptes:
1
import sys
2
sys.stderr = sys.stdout
Das gibt eventuelle Fehler über den Browser aus.

von Matthias (Gast)


Lesenswert?

THX Mario

Hier die Ausgabe
1
 Error in sys.excepthook: Traceback (most recent call last): File "/usr/lib/python3.4/cgitb.py", line 268, in __call__ self.handle((etype, evalue, etb)) File "/usr/lib/python3.4/cgitb.py", line 288, in handle self.file.write(doc + '\n') UnicodeEncodeError: 'ascii' codec can't encode character '\xfc' in position 1265: ordinal not in range(128) Original exception was: Traceback (most recent call last): File "/../cgi-bin/mycgi.py", line 27, in UnicodeEncodeError: 'ascii' codec can't encode character '\xfc' in position 22: ordinal not in range(128)

Ahhhhhh Unicode-Verhackstückung!

von Matthias (Gast)


Lesenswert?

Lokal funktioniert es mit der open() Ergänzung um den utf-8 encoding 
Zusatz. Damit war das Thema gegessen, dachte ich eigentlich.

Der Fehlermeldung nach liegt der Fehler im HTMLPart, der einen Umlaut 
verwendet ((ü)bertragen).

Da das submitten der eigentlichen Formulardaten an das CGISkript auch 
mit unicode funktioniert, habe ich einfach die Umlaute aus dem HTMLPart 
genommen und ES LÄUFT!!

von Mario M. (thelonging)


Lesenswert?

Das freut mich. Danke für die Rückmeldung.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.