Python-Skript als CGI mittels <!--#exec cgi=...> einbi

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Montag 11. Juni 2007, 15:28

Hallo,

ich bin Python-Neuling und experimentiere derzeit noch mit verschiedenen Möglichkeiten herum, um auszuloten, was geht (bzw. was ich hinbekomme) und was nicht und ob es sich für mich lohnt, tiefer in Python einzusteigen.

Momentan kann ich folgendes Problem nicht lösen:

Ich möchte via CGI (andere Möglichkeiten lässt mir mein Provider nicht) Python ausführen. Das klappt auch im Prinzip. "Im Prinzip" heißt: Ich kann ein Python-Skript z.B. über einen Link aufrufen und mir eine HTML-Seite vom Skript generieren/anzeigen lassen. Und: Ich kann Daten aus einem HTML-Formular (via POST) auslesen und verarbeiten.

Was NICHT klappt, ist folgendes: Ich möchte innerhalb eines statisch erzeugten HTML-Dokuments an einer beliebigen Stelle ein Python-Skript (via CGI) aufrufen, das irgendeinen Wert zurückliefert, den ich an der Stelle des Aufrufs im HTML-Dokument einfügen will.

Laut SelfHTML sollte das so funktionieren:
<!--#exec cgi="/cgi-bin/pytest.py" -->
Wobei dann die vom Programm erzeugte Standardausgabe (das dürfte, wie ich es verstanden habe, mittels print "...." geschehen) an dieser Stelle eingefügt werden sollte.

Funktioniert aber leider nicht. An der entsprechenden Stelle erscheint
die Fehlermeldung:
[an error occurred while processing this directive]
Wenn ich das cgi-Modul in das Skript integriere und das debugging einschalte, kommt keine Fehlermeldung.
Wenn ich das gleiche Skript über einen Link aufrufe, funktioniert es.

Vielleicht hat jemand der erfahrenen Pythonen einen hilfreichen Tipp für mich.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Montag 11. Juni 2007, 19:14

pütone hat geschrieben:<!--#exec cgi="/cgi-bin/pytest.py" -->
Hallo pütone!

Willkommen im Python-Forum!

Das sieht nach "Server-Side Includes" (SSI) aus. Das ist dann keine statische HTML-Seite mehr.

Siehe: http://httpd.apache.org/docs/2.2/mod/mod_include.html

Wie auch immer. SSI-Dateien müssen die Endung ".shtml" haben, damit sie funktionieren. Das Modul "mod_include" muss vom Apachen geladen werden. Und der Ordner in dem die SHTML-Datei steht, muss für SHTML aktiviert sein.

Zur Not kannst du dir eine ".htaccess"-Datei (beachte den Punkt) erstellen und mit diesen Zeilen mod_include aktivieren:

Code: Alles auswählen

AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
Options +Includes
Dann würde ich noch eine "test.shtml"-Datei erstellen und NUR

Code: Alles auswählen

<!--#exec cgi="/cgi-bin/pytest.py" -->
rein schreiben. Wenn du diese Datei aufrufst, dann sollte nur die Rückgabe von "pytest.py" erscheinen. Vielleicht hast du Zugriff auf die Logdateien des Apachen. Darin könnte evt. genaueres stehen.

Du könntest aber auch

Code: Alles auswählen

<!--#include virtual="/cgi-bin/pytest.py" -->
ausprobieren. Vielleicht bekommst du dann eine bessere Fehlermeldung.

Versuche auch mal dieses Test-CGI-Skript damit auszuliefern. Vielleicht ist der Fehler ja doch im CGI-Skript:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

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

print "Hello World!"
mfg
Gerold
:-)
[url]http://halvar.at[/url] | [url=http://halvar.at/elektronik/kleiner_bascom_avr_kurs/]Kleiner Bascom AVR Kurs[/url]
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Montag 11. Juni 2007, 19:29

Hallo gerold,

danke für die schnelle Hilfe!

Dass mit den SSI hatte ich schon verstanden, die HTML-Datei hatte bereits die richtige Endung - hatte ich aber vergessen zu erwähnen.

Ich habe deinen ersten Tipp befolgt und die entsprechende htaccess-Datei in den entsprechenden Ordner verfrachtet - und das war dann auch schon die Lösung!

Jetzt funktioniert es genau so, wie ich es mir vorgestellt hatte.

Nochmals: DANKE für die schnelle und professionelle Hilfe!
Antworten