Seite 1 von 1
Python Code mit unbekanntem Dateityp o. Download verbunden
Verfasst: Mittwoch 8. November 2006, 19:42
von cirox
Hallo,
immer wenn ich Python Code ausführen möchte bietet der Browser nur den Download mit unbekanntem Dateityp an.
Meine Konfiguration:
-Apache/2.0.54 (Debian GNU/Linux)
-2.4.2 mod_python/3.1.3 Python/2.3.5
-PHP über FastCGI
/etc/apache2/mods-enabled/mod_python.load
Code: Alles auswählen
LoadModule python_module /usr/lib/apache2/modules/mod_python.so
vhost
Code: Alles auswählen
<Directory "/var/www/webx/html/cgi-bin/">
<IfModule mod_python.c>
<Files ~ "\.py$">
AddHandler python-program .py
PythonHandler mod_python.[b]cgihandler[/b]
</Files>
</IfModule>
vhost
Code: Alles auswählen
<VirtualHost xx.xx.xx.xx:80>
ServerName xx.de
ServerAlias www.xx.de
DocumentRoot /var/www/webx/html/
SuexecUserGroup webx webx
ScriptAlias /cgi-bin/ /var/www/webx/html/cgi-bin/
<IfModule mod_python.c>
<Files ~ "\.py$">
AddHandler python-program .py
PythonHandler mod_python.[b]publisher[/b]
</Files>
</IfModule>
</VirtualHost xx.xx.xx.xx:80>
Ich habe mich zum Testen an dieses Howto gehalten:
http://www.modpython.org/live/current/modpython.pdf
und auch eine htaccess Datei im cgi-bin Verzeicnis erstellt:
Code: Alles auswählen
AddHandler mod_python .py
PythonHandler mptest
PythonDebug On
wenn ich meinetwegen Leerzeichen in diese Testdatei reinmache und versuche Sie auszuführen kommt folgendes:
Testdatei:
Code: Alles auswählen
from mod_python import apache
def handler(req):
req.content_type = ’text/plain’
req.write("Hello World!")
return apache.OK
Fehler wenn Leerzeichen falsch oder kein Abstand:
Code: Alles auswählen
Mod_python error: "PythonHandler mod_python.cgihandler"
Traceback (most recent call last):
File "/usr/lib/python2.3/site-packages/mod_python/apache.py", line 299, in HandlerDispatch
result = object(req)
File "/usr/lib/python2.3/site-packages/mod_python/cgihandler.py", line 96, in handler
imp.load_module(module_name, fd, path, desc)
File "/var/www/webx/html/cgi-bin/mptest.py", line 3
req.content_type = ’text/plain’
^
SyntaxError: invalid syntax
Wenn ich jetzt den Python Code richtig einrücke, also auf Leerzeichen achte, ihn valide mache, dann kommt der download.
Was läuft hier falsch? Hab ich irgendwas mit den Handlern oder mime Codes übersehen ?
danke und gruß cirox
Verfasst: Mittwoch 8. November 2006, 20:55
von Y0Gi
Was mir auf den ersten Blick unangenehm auffällt sind die ..-Tags, die zwei mal in den Config-File-Beispielen auftauchen, sowie die Backticks um den MIME-Typ-String, die du anstelle einfacher oder doppelter Hochkommata in der im Traceback angekreideten Zeile verwendest.
Verfasst: Mittwoch 8. November 2006, 21:09
von cirox
Nein, ich hab den Code valide gemacht, nicht wie hier gepostet, sobald er das ist bekomm ich den download. Das mit den
Code: Alles auswählen
<Files ~ "\.py$">
AddHandler python-program .py
PythonHandler mod_python.[b]cgihandler[/b]
</Files>
das meinst Du doch? , ist ganz normal Confixx, wie bei anderen auch m.E.
gruß cirox
Verfasst: Mittwoch 8. November 2006, 23:15
von birkenfeld
Was soll das "[ b ]" in der Apache-Config? Steht das da wirklich drin?
Verfasst: Mittwoch 8. November 2006, 23:44
von cirox
Hallo,
natürlich sind keine html Tags im Forum erlaubt. Ich wollte die Unterschiede hier im Forum fett darstellen.
gruß cirox
Verfasst: Donnerstag 9. November 2006, 12:01
von Y0Gi
Wenn dein Script vom Browser zum Download angeboten wird, scheint wohl der mod_python-Handler nicht zu greifen. Ein falscher MIME-Typ *könnte* auch die Ursache sein, halte ich aber für ungleich unwahrscheinlicher und ein 500er wäre z.B. bei Tippfehlern oder ganz vergessenenem MIME-Header eher zu erwarten.
Verfasst: Donnerstag 9. November 2006, 12:30
von cirox
Hallo,
ich habe unter /etc/mime.types 2 Einträge:
Code: Alles auswählen
text/x-python py
und
application/x-python-code pyc pyo
Aber wie soll ich das mit den Handlern lösen bzw. überprüfen?
Verfasst: Donnerstag 9. November 2006, 12:56
von jens
Ich würde mal in [wiki]Web-Skripte zum laufen bringen[/wiki] reinschauen
Kann es sein das es am fehlenden AddHandler luegt? Siehe: [wiki]Web-Skripte zum laufen bringen#Ausfhrungsrechte[/wiki]
Verfasst: Donnerstag 9. November 2006, 14:54
von cirox
Hallo,
also langsam verlier ich den Überblick. Warum in alles in der Welt kann ich:
1. Den Interpreterpfad im Skript ändern auf irgendwas, die Testskripte werden ausgeführt:
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: UTF-8 -*-
# Debugging für CGI-Skripte 'einschalten'
import cgitb; cgitb.enable()
print "Content-Type: text/html;charset=utf-8\n"
print "Hello World!"
Ergebis -> Hello World
und das mit der Endung .py
Ja mein Gott wird hier jetzt Python ausgeführt oder nicht ?
Sag ich aber folgendes:
Code: Alles auswählen
from mod_python import apache
def handler(req):
req.write("Hello World!")
return apache.OK
kommt der download -> Warum ?
folgendes:
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: UTF-8 -*-
print "Content-Type: text/html;charset=utf-8\n"
import cgitb; cgitb.enable() # Debugging für CGI-Skripte 'einschalten'
import os
print "einfacher mod_python Test"
if __name__ != "__main__":
# Kann passieren, wenn das Skript nicht als CGI läuft, sondern
# evtl. über mod_python
print "<h1>Fehler:</h1>"
print "<p>__name__ == %s (sollte aber == '__main__' sein!)</p>" % __name__
print "<hr />"
try:
gateway = os.environ["GATEWAY_INTERFACE"]
except KeyError:
print "Fehler: GATEWAY_INTERFACE ist nicht in os.environ!"
print "Wahrscheinlich ist der Server nicht richtig konfiguriert."
else:
print "<p>GATEWAY_INTERFACE: <strong>%s</strong></p>" % gateway
if gateway=="CGI/1.1":
print "<p>OK, running as CGI.</p>"
else:
print "<h3>Not running as CGI!</h3>"
# Mal sehen ob das mod_python Modul verfügbar ist. Wenn ja, ist mod_python
# generell installiert, aber evtl. nicht aktiv.
try:
import mod_python
except ImportError, e:
print "<p>Note: Can't import mod_python module: %s</p>" % e
ergibt jenes: (mit der endung .py)
Code: Alles auswählen
einfacher mod_python Test
Fehler:
__name__ == test (sollte aber == '__main__' sein!)
GATEWAY_INTERFACE: Python-CGI/1.1
Not running as CGI!
und zum Schluss was ich gar nicht verstehe ist das jetzt python oder mod_python oder ich weiss es nicht:
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import cgitb; cgitb.enable() # Debugging für CGI-Skripte 'einschalten'
print "Content-Type: text/html; charset=utf-8\n"
print "<h1>Hello World!</h1>"
print "<hr/>"
import sys, os
print "<h3>Python v%s</h3>" % sys.version
print "<h3>os.uname():</h3>%s<br />" % " - ".join(os.uname())
print "<h3>sys.path:</h3>"
sys_path = sys.path[:]
sys_path.sort()
for p in sys_path:
print "%s<br />" % p
print "<h3>OS-Enviroment:</h3>"
print '<dl id="environment">'
keys = os.environ.keys()
keys.sort()
for key in keys:
value = os.environ[key]
print "<dt>%s</dt>" % key
print "<dd>%s</dd>" % value
print "</dl>"
ergibt mit der endung .py das:
Code: Alles auswählen
Hello World!
Python v2.3.5 (#1, Oct 16 2006, 19:18:40) [GCC 3.3.5 (Debian 1:3.3.5-13)]
os.uname():
Linux - srvx.xx.de - 2.6.8-3-k7 - #1 Thu Sep 7 05:09:40 UTC 2006 - i686
sys.path:
/usr/lib/python2.3
/usr/lib/python2.3/lib-dynload
/usr/lib/python2.3/lib-tk
/usr/lib/python2.3/plat-linux2
/usr/lib/python2.3/site-packages
/usr/lib/python23.zip
/usr/local/lib/python2.3/site-packages
\.py$/
OS-Enviroment:
DOCUMENT_ROOT
/var/www/web2/html
GATEWAY_INTERFACE
Python-CGI/1.1
HTTP_ACCEPT
text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
HTTP_ACCEPT_CHARSET
ISO-8859-1,utf-8;q=0.7,*;q=0.7
HTTP_ACCEPT_ENCODING
gzip,deflate
HTTP_ACCEPT_LANGUAGE
de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
HTTP_CACHE_CONTROL
max-age=0
HTTP_CONNECTION
keep-alive
HTTP_HOST
webx.srvx.xxx.de
HTTP_KEEP_ALIVE
300
HTTP_USER_AGENT
Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.0.8) Gecko/20061025 Firefox/1.5.0.8
PATH
/usr/local/bin:/usr/bin:/bin
QUERY_STRING
REMOTE_ADDR
84.188.254.11
REMOTE_PORT
3095
REQUEST_METHOD
GET
REQUEST_URI
/cgi-bin/test.py
SCRIPT_FILENAME
/var/www/web2/html/cgi-bin/test.py
SCRIPT_NAME
/cgi-bin/test.py
SERVER_ADDR
85.10.197.143
SERVER_ADMIN
[no address given]
SERVER_NAME
web2.srvx.xx.de
SERVER_PORT
80
SERVER_PROTOCOL
HTTP/1.1
SERVER_SIGNATURE
SERVER_SOFTWARE
Apache/2.0.54 (Debian GNU/Linux) mod_ssl/2.0.54 OpenSSL/0.9.7e mod_fastcgi/2.4.2 mod_python/3.1.3 Python/2.3.5 mod_perl/1.999.21 Perl/v5.8.4
versteh ich nicht. Wir hier Python ausgeführt - wohl kaum oder ?
Wie gesagt richtiger Python Code , siehe oben - kommt mit download - oder ist das falscher python Code? Und wie gesagt der Interpreterpfad ist nutzlos, da kann ich auch einstellen was ich will , immer das Gleiche Ergebis.
gruß cirox
Verfasst: Donnerstag 9. November 2006, 15:10
von jens
Als erstes mal:
http://www.python-forum.de/faq.php#21
Generell: mod_Python brauchst du nur wenn du es wirklich verwenden willst! Es ist was anderes als modPHP!
cirox hat geschrieben:1. Den Interpreterpfad im Skript ändern auf irgendwas, die Testskripte werden ausgeführt:
Das ist allerdings komisch. Vielleicht ist der Interpreter in der Apache-config festgelegt? Also das *.py immer mit diesem Interpreter ausgeführt werden, egal was im Skript steht...
cirox hat geschrieben:Sag ich aber folgendes:
Code: Alles auswählen
from mod_python import apache
def handler(req):
req.write("Hello World!")
return apache.OK
kommt der download -> Warum ?
Hast du da nur die Kopfzeilen nicht gepostet oder fehlen die auch auf dem Server??? Wie ist da die Dateiendung?
cirox hat geschrieben:einfacher mod_python Test
Fehler:
__name__ == test (sollte aber == '__main__' sein!)
GATEWAY_INTERFACE: Python-CGI/1.1
Not running as CGI!
Das sieht gut aus! Bei das Skript läuft mit mod_python! Dann ist es IMHO normal das
__name__ == test ist.
Kann es sein, das es bei dir wie folgt konfiguriert ist:
- *.CGI laufen als Python-CGI
*.py laufen mit mod_python
Verfasst: Donnerstag 9. November 2006, 15:24
von cirox
ok
jens hat geschrieben:
Das ist allerdings komisch. Vielleicht ist der Interpreter in der Apache-config festgelegt? Also das *.py immer mit diesem Interpreter ausgeführt werden, egal was im Skript steht...
Vielleicht im mod_python Modul? Allerdings hab ich nur den Aufruf in der /etc/apache2/mod_enabled/ .....
also den Aufruf mit .so, woanders gibts ja immer noch ne .conf
cirox hat geschrieben:Sag ich aber folgendes:
Code: Alles auswählen
from mod_python import apache
def handler(req):
req.write("Hello World!")
return apache.OK
kommt der download -> Warum ?
jens hat geschrieben:
Hast du da nur die Kopfzeilen nicht gepostet oder fehlen die auch auf dem Server??? Wie ist da die Dateiendung?
.py , nein ich hab den Code genauso im Skript drin stehen ... Falsch ?
jens hat geschrieben:
Kann es sein, das es bei dir wie folgt konfiguriert ist:
- *.CGI laufen als Python-CGI
*.py laufen mit mod_python
weiss ich nicht aber .pl usw. läuft normal
Code: Alles auswählen
<VirtualHost 85.10.197.143:443>
ServerName web2.srv4.xxxx.de
DocumentRoot /var/www/web2/html
SuexecUserGroup web2 web2
ScriptAlias /cgi-bin/ /var/www/web2/html/cgi-bin/
<IfModule mod_python.c>
<Files ~ "\.py$">
AddHandler python-program .py
PythonHandler mod_python.publisher
</Files>
</IfModule>
.....
Verfasst: Donnerstag 9. November 2006, 15:34
von jens
cirox hat geschrieben:Code: Alles auswählen
<VirtualHost 85.10.197.143:443>
...
<IfModule mod_python.c>
<Files ~ "\.py$">
AddHandler python-program .py
PythonHandler mod_python.publisher
</Files>
</IfModule>
.....
Na, das sagt doch IMHO das was ich vermutet habe. Alle *.py Dateien werden durch mod_python gejagt
Code: Alles auswählen
from mod_python import apache
def handler(req):
req.write("Hello World!")
return apache.OK
Da muß natürlich auch der Kopf in Ordnung sein! Also so:
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: UTF-8 -*-
from mod_python import apache
def handler(req):
req.write("Hello World!")
return apache.OK
Unterm Strich klappt doch dann alles.
Verfasst: Donnerstag 9. November 2006, 15:40
von cirox
Hallo,
ich bekomm leider auch mit Deinem bereinigten Code wieder einen Download.
gruß cirox
Verfasst: Freitag 10. November 2006, 11:23
von Y0Gi
Ich arbeite nicht mit mod_python, aber musst du nicht bei letzterem Codestück auch den MIME-Typ manuell mit ausgeben? Wenn kein Header und nur der Body ("Hello World") bzw. damit ein ungültiger Header kommt, wird *möglicherweise* vom Apachen oder sogar mod_python ein anderer MIME-Typ gesetzt - ohne MIME-Typ erwarte ich allerdings einen 500er-Fehler, also muss da irgendwo zwischendrin noch "Magic" sein.
Tut mir leid, dass ich dir da nicht konkreter weiterhelfen kann, aber dafür habe *ich* gelernt, dass ich auch weiterhin mod_python aus dem Weg gehen kann
Unverbindlicher Tipp: Wenn du nicht zwingend auf mod_python angewiesen bist und vorzugsweise eine WSGI-kompatible Web-Anwendung hast, fährst du zumindest Konfigurationstechnisch mit mod_fcgid (sprich: FastCGI) deutlich problemloser.
Verfasst: Freitag 10. November 2006, 11:27
von cirox
Hallo,
bei mir ist fast-cgi im Einsatz. Halt noch nicht das neue fcgid aber meins tuts ja auch noch.
Wie geht man denn da am besten vor? - brauche bloss ein paar Stichwörter oder Links
Würde auch gerne das mod_python rausschmeissen. Ist mir sicherheitstechnisch eh ein bisschen bedenklich.
danke und gruß cirox
Verfasst: Freitag 10. November 2006, 11:34
von jens
Y0Gi hat geschrieben:musst du nicht bei letzterem Codestück auch den MIME-Typ manuell mit ausgeben?
Ich selber nutzt auch noch kein modPython...
Hab das gefunden:
http://www.hostsharing.net/dokumentatio ... ython.html
Da ist das selbe Codestück zu finden...
Man kann es aber noch erweitern:
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: UTF-8 -*-
from mod_python import apache
def handler(req):
req.content_type = "text/plain"
req.write("Hello World!")
return apache.OK
Steht so in dem Thread:
http://www.mail-archive.com/debian-user ... 42587.html
Das selbe steht auch hier:
http://modpython.org/live/current/doc-h ... sting.html