mod_python testen ob installiert ?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Hi,
habe unter Susi-Linux Apache2 laufen und will jetzt mod_python dazu nehmen.
Habe mod_python installiert und bin zum Testen genauso vorgegangen, wie hier beschrieben:

http://www.modpython.org/live/current/d ... onfig.html
http://www.modpython.org/live/current/d ... sting.html

Aber alles was mir der Browser anzeigt, ist dann das Testscript selber:

Code: Alles auswählen

from mod_python import apache

def handler(req):
    req.content_type = 'text/plain'
    req.write("Hello World!")
    return apache.OK
(die fehlerhafte Einrückung, die mir die Vorschau anzeigt, ist im Original nicht)
Hat einer von euch mod_python zum Laufen bekommen und kann mir einen Tipp geben ?
Gruss, Seven
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Schon mal:

/etc/init.d/apache2 restart

gemacht? Unabhängig davon: die Konfiguration von mod_python ist die allergrößte Scheiße. Wenn Du nicht umbedingt auf modpy angewiesen bist, dann guck Dir FastCGI an... Mit entsprechenden Wrappern (zum Beispiel jon-py) hat das die selbe Geschwindigkeit und ist WSGI-kompatibel, und ist erheblich einfacher zu benutzen.
--- Heiko.
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

modelnine hat geschrieben:... Wenn Du nicht umbedingt auf modpy angewiesen bist, dann guck Dir FastCGI an...
Also das 'restart' werde ich auf jeden Fall ausprobieren.
Auf CGI habe ich eigentlich keine Lust, schließlich kann ich ja alles was mit CGI geht auch in Python programmieren ? Es muss ja gehen, denn es soll ja auch User geben, die mit mod_python keine Probleme haben.

Gruss, Seven
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

FastCGI != CGI. FastCGI ist im Endeffekt was ähnliches wie modpy, nämlich dass ein Interpreter transient geladen wird, und der selbe Interpreter mit dem selben Programm immer wieder neu die eintreffenden Request beantwortet. modpy ist nix anderes, nur Python-spezifisch.
--- Heiko.
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Hm, also hier steht was anderes über Fast CGI:

http://www.at-mix.de/fastcgi.htm

Ich will aber mit Python arbeiten. Gibt es unterschiedliche Fast-CGIs ?

Gruss, Seven, der sich auf Arbeit nicht einloggen kann.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sag doch lieber was du eigentlich damit machen willst. Vielleicht wäre da ein Framework für dich geeigneter?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Um mal kurz den Unterschied zwischen mod_python, FastCGI und CGI zu detailieren:

CGI: Ein Programm liegt irgendwo im Document-Tree, und wird vom Apache-Server jedes mal neu gestartet wenn eine Anfrage kommt. Das Programm kriegt über das Environment Parameter mit die spezifizieren wie auf das CGI zugegriffen wurde.

Fast-CGI: Ein Programm wird vom FastCGI-Modul einmal geladen, und wartet dann in einer Art Busy-Loop. Sobald mod_fastcgi eine Anfrage bekommt wird diese Anfrage serialisiert, per stdin an den Prozess (der ja schon bereits läuft) geschickt, von einer Middelware (z.B. jon-py) deserialisiert, und dann an das eigentliche dynamische Skript weitergegeben. Die Übergabe an das eigentliche Skript (vielleicht sollte man eher Handler sagen) findet mittels WSGI statt (bei jon-py).

mod_python: Ein Python-Interpreter wird geladen, das entsprechende Modul wird importiert, und sobald eine Anfrage auf die entsprechende URL kommt wo das Modul liegt ruft mod_python eine Funktion des Moduls auf, nämlich den handler. Die Daten bekommt das Modul über ein apache-Objekt, welches den Zustand des aktuellen mod_python threads enthält.

Vorteil von 2+3: beide laden den Python-Interpreter ein mal, und nicht jedes mal wenn das CGI gestartet werden soll.

Gleichheit von 2+3: siehe den Vorteil.

Dass die Parameterübergabe bei 2+3 unterschiedlich ist liegt an der Middleware. Es gibt auch für mod_python Middleware die aus einer mod_python-Anfrage eine WSGI-kompatible Anfrage macht und an einen WSGI-Handler dispatcht. Nur macht das mod_python nicht automatisch, genauso wenig wie's FastCGI automatisch macht, denn beide benutzen proprietäre Protokolle um das aktuelle Request in die laufende Instanz reinzukriegen (mod_python direkt, weil's nur auf Python ausgelegt ist, FastCGI über eine Serialisierungsmethode).

Sonst: FastCGI ist im Prinzip genau das selbe wie mod_python auch, nur allgemeiner, denn eben nicht nur für Python gedacht. Ganz egal was jemand anderes sagt, der hats dann einfach nicht verstanden.
--- Heiko.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Dann gäbe es noch SCGI, dass einen server auf irgendeinem port startet und dort vom apachen befehle entgegennimmt und die ausgabe an den apachen weiterleitet.

Und nochwas zu mod_python: wenn du es nicht wegen einer anwendung brauchst würde ich es nicht nehmen. Mach eine WSGI kompatible anwendung und lass es auf FastCGI laufen. Vorteile: Es funktioniert [sic!], es ist schnell und es läuft mit SuExec
TUFKAB – the user formerly known as blackbird
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

@modelnine: Deine ganzen letzten Beiträge solltest du in's Wiki packen! Oder am besten, wenn du so ausführlich Antwortest, dann direkt im Wiki schreiben und nur einen Link im Forum setzten :lol:


@blackbird: Ist modPython über WSGI auch nicht empfehlenswert? Ich hab zwar bisher noch nicht probiert, wollte es aber irgendwann mal machen... Im Windows XMAPP Paket erhält man IMHO nur ein modPython und kein fastCGI...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

jens hat geschrieben:@blackbird: Ist modPython über WSGI auch nicht empfehlenswert? Ich hab zwar bisher noch nicht probiert, wollte es aber irgendwann mal machen... Im Windows XMAPP Paket erhält man IMHO nur ein modPython und kein fastCGI...
Ich gehe davon aus, dass man FastCGI support hat. Selbst php läuft über FastCGI runder als über mod_php.
TUFKAB – the user formerly known as blackbird
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Ok, worum es geht: Zur Zeit läuft alles auf Win-XP mit Zope. Folgende externe Methode schreibt ein Dummy-Textfile. Die nötigen Infos zieht sich ein weiteres threadgesteuertes Script außerhalb von Zope aus dem Dateinamen. Nachdem dieses Script seinen Job erledigt hat, wird das Textfile wieder gelöscht.

Code: Alles auswählen

def bestell1(self):
    mess = ""
    nam = self.REQUEST.selectName
    mus = self.REQUEST.selectMusik
    em = self.REQUEST.selectEmail
    tel = self.REQUEST.selectTelnr

    fname = mess + nam + "_" + mus + "_" + em + "_" + tel
    try:
        datei = open("/home/xx/Documents/Messages/Bestell1/" + fname + ".txt","a")
        datei.close()
        return "Message: "+mess+"\nName(n):   "+nam[1:]+"\nMusik:     "+mus+"\nE-Mail:    "+em+"\nTel-Nr.:   "+tel
    except:
        return "Es ist ein Fehler aufgetreten. Anfrage wurde nicht bearbeitet"
Jetzt will ich das ganze auf einen Miet-Root-Server packen, aber unter Apache statt Zope. Erstens finde ich Zope für dieses Bischen Script überdimensioniert, zweitens ist auf den meisten Mietservern Apache schon drauf und ich muß nicht ein Zope auf einen Apache raufoperieren. Da ich die externen Methoden aus Zope gern weiterverwenden würde, kam ich auf mod_python. Vieleicht ginge CGI, Perl oder PHP auch, aber ich habe keine Erfahrungen damit. Laut Paketmanager ist mod-python 3.1.3-43 drauf, aber ich bekomme es nicht getestet. Ich hoffe, mein Anliegen wird klar.

Grüße, Seven
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

snakeseven hat geschrieben:Laut Paketmanager ist mod-python 3.1.3-43 drauf, aber ich bekomme es nicht getestet. Ich hoffe, mein Anliegen wird klar.
Dann wirds nicht gehten. mod_python zu konfigurieren ist eine Kunst für sich.

Für deine Zweck scheint CGI noch das beste zu sein, vor allem wenn du auf dem Server keine root-Rechte hast.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Leonidas hat geschrieben: Für deine Zweck scheint CGI noch das beste zu sein, vor allem wenn du auf dem Server keine root-Rechte hast.
Ich muss natürlich einen Server mit Root-Rechten mieten, weil ich ja auch noch Lame dazuinstallieren muss. CGI wäre für das bischen Dateierstellen warscheinlich wirklich das Einfachste. Blöd aber, dass ich wegen dem schlecht dokumentierten mod_python zum CGI Programmieren genötigt werde, wo ich doch Python kann ?

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

snakeseven hat geschrieben:Blöd aber, dass ich wegen dem schlecht dokumentierten mod_python zum CGI Programmieren genötigt werde, wo ich doch Python kann ?
Das ist nicht nur das schlecht dokumentierte mod_python sondern das nicht mit mod_php vergleichbare mod_python. Ich würde mod_python nicht direkt nutzen, sondern nur als Verbindung mit Apache (oder FastCGI/SCGI) und dann WSGI oder eines von den Web-Frameworks nutzen. Da hast du alles dabei und es funktioniert auch gescheit und ist dokumentiert und hat viele User und dementsprechend viel Support.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

snakeseven hat geschrieben:CGI wäre für das bischen Dateierstellen warscheinlich wirklich das Einfachste. Blöd aber, dass ich wegen dem schlecht dokumentierten mod_python zum CGI Programmieren genötigt werde, wo ich doch Python kann ?
Hi Seven!

Ich glaube, du hast das falsch verstanden. CGI ist **nicht** gleich Perl.
Du kannst auch mit Python CGI-Programme erstellen.

Siehe: http://www.python-forum.de/viewtopic.php?p=31590#31590
Den Server brauchst du nicht, wenn du den Apache einsetzt. Aber das ist schon mal ein Beispiel für CGI.

Hier ist noch ein einfacheres Beispiel für CGI: http://www.python-forum.de/viewtopic.php?p=17612#17612

Und da drinnen wird aufgezeigt, wie du zu den Formulardaten kommst: http://python.org/doc/2.4.2/lib/node471.html

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Nur noch mal um das klarzustellen:

CGI = Common Gateway Interface

Das ist keine Programmiersprache, sondern eine Interface-Spezifikation wie ein Server die Daten eines Requests an ein dynamisches Programm weitergibt. CGI ist an keine Programmiersprache gebunden...
--- Heiko.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi Seven!

Noch etwas:

In den Ordner, in dem die "AUSFÜHRBARE" Python-Datei liegt, musst du eine Datei mit dem Namen ".htaccess" (beachte den Punkt) erstellen. In diese Datei schreibst du

Code: Alles auswählen

Options +ExecCGI
AddHandler cgi-script .py
Damit wird dem Apachen gesagt, dass Dateien mit der Endung ".py", mit dem Python-Interpreter auszuführen sind. Schon werden in dem Ordner Python-Dateien als CGI-Dateien ausgeführt.

Wichtig:
1. Python-Dateien müssen als "Ausführbar" gekennzeichnet sein.
2. Der Apache muss auf die Datei zugreifen und diese ausführen können.
3. Dem Apachen muss gesagt werden, dass Dateien mit der Endung ".py" CGI-Skripte sind.
4. Die erste Zeile der Python-Datei müss dem Apachen zeigen, mit welchem Programm das Skript auszuführen ist.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

modelnine hat geschrieben:...
CGI = Common Gateway Interface

Das ist keine Programmiersprache, sondern eine Interface-Spezifikation wie ein Server die Daten eines Requests an ein dynamisches Programm weitergibt. CGI ist an keine Programmiersprache gebunden...
Das ist ja schon mal eine wichtige und beruhigende Erkenntnis :) Leider bekomme ich noch nicht einmal dieses supersimple Test-CGI zum Laufen:

Code: Alles auswählen

#!/usr/bin/python2.4
print "Content-type: text/html"
print

print "<html>"
print "<body>"
print "<h1>CGI Test</h1>"
print "</body>"
print "</html>"
Es kommt folgende Fehlermeldung:

Code: Alles auswählen

Object not found!

The requested URL was not found on this server. If you entered the URL manually please check your spelling and try again.

If you think this is a server error, please contact the webmaster.
Error 404
localhost
Tue Mar 21 08:51:22 2006
Apache/2.0.54 (Linux/SUSE)
In meiner 'default-server.conf' steht:

Code: Alles auswählen

ScriptAlias /cgi-bin/ "/srv/www/cgi-bin/"

# "/srv/www/cgi-bin" should be changed to whatever your ScriptAliased
# CGI directory exists, if you have that configured.
#
<Directory "/srv/www/cgi-bin">
	AllowOverride None
	Options +ExecCGI -Includes
	Order allow,deny
	Allow from all
</Directory>
Gruss, Seven
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

snakeseven hat geschrieben: Es kommt folgende Fehlermeldung:

Code: Alles auswählen

Object not found!
In meiner 'default-server.conf' steht:

Code: Alles auswählen

<Directory "/srv/www/cgi-bin">
	AllowOverride None
	Options +ExecCGI -Includes
	Order allow,deny
	Allow from all
</Directory>
Hi Seven!

Vorab: Verwende nicht das CGI-BIN-Verzeichnis. Das ist durch die Einstellung AllowOverride None so eingeschränkt, dass du keine ".htaccess"-Datei verwenden kannst um die Einstellungen zu ergänzen oder zu überschreiben.

Das Einfachste wird sein, wenn du deine Tests in einem eigenen Ordner durchführst.

Welcher der Apache-Root-Ordner ist, findest du über die Konfigurationsdatei des Apachen raus. Suche nach "DocumentRoot". Das ist dann normalerweise der Ordner der Aufgerufen wird, wenn du im Browser "http://localhost/" eingibst.

Erstelle dir unterhalb des Apache-Root-Ordners einen neuen Ordner, in dem du dein Skript ausprobieren kannst. Nicht vergessen: ".htaccess"-Datei erstellen; Ausführbar; für Apache lesbar.

Wenn dein Skript im Unterordner "mein_testordner" liegt und "mein_testskript.py" heißt, dann sollte die URL http://localhost/mein_testordner/mein_testskript.py" greifen.

Ob es allerdings bei Suse erlaubt ist, ".htaccess"-Dateien zu verwenden, weiß ich nicht, da ich schon ein paar Jahre lang kein Suse mehr in der Hand hatte.

Folgendes sollte immer funktionieren:

Ändere deine "default-server.conf" so um, dass dieser Block so aussieht:

Code: Alles auswählen

<Directory "/srv/www/cgi-bin">
    AllowOverride None
    Options +ExecCGI -Includes
    Order allow,deny
    Allow from all
    AddHandler cgi-script .py
</Directory>
und starte den Apachen neu. Dann kannst du dein Skript in den CGI-BIN-Ordner legen und ausprobieren.
http://localhost/cgi-bin/skriptname.py

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
snakeseven
User
Beiträge: 408
Registriert: Freitag 7. Oktober 2005, 14:37
Wohnort: Berlin
Kontaktdaten:

Hi Gerold,
erstmal Danke für die schnelle Antwort !
Habe zunächst die einfachere (2.) Variante ausprobiert, aber leider ohne Erfolg. Fehlermeldung:
The server encountered an internal error and was unable to complete your request.

Error message:
Premature end of script headers: cgitest.py


Die 'default-server.conf' habe ich vorher entsprechend geändert und den Server mit '/etc/init.d/apache2 restart' neu gestartet.

Das CGI-Modul wird korrekt in 'loadmodule.conf' geladen und ein Perl-Script in der cgi-bin wird auch korrekt ausgeführt. Wat nu ?

Gruss, Seven

P.S. Nochwas: bei meinen Python-Scripten musste ich die shebang auf '#!/usr/bin/env python' setzen, damit sie laufen. Jetzt lautet sie (oder der ?) '#!/usr/bin/python2.4'. Ich verstehe den Unterschied nicht ?
Zuletzt geändert von snakeseven am Dienstag 21. März 2006, 11:29, insgesamt 1-mal geändert.
Antworten