Python Code mit unbekanntem Dateityp o. Download verbunden

Probleme bei der Installation?
Antworten
cirox
User
Beiträge: 8
Registriert: Mittwoch 8. November 2006, 19:07

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
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

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.
cirox
User
Beiträge: 8
Registriert: Mittwoch 8. November 2006, 19:07

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
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Was soll das "[ b ]" in der Apache-Config? Steht das da wirklich drin?
cirox
User
Beiträge: 8
Registriert: Mittwoch 8. November 2006, 19:07

Hallo,

natürlich sind keine html Tags im Forum erlaubt. Ich wollte die Unterschiede hier im Forum fett darstellen.

gruß cirox
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

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.
cirox
User
Beiträge: 8
Registriert: Mittwoch 8. November 2006, 19:07

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?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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]

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
cirox
User
Beiträge: 8
Registriert: Mittwoch 8. November 2006, 19:07

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
cirox
User
Beiträge: 8
Registriert: Mittwoch 8. November 2006, 19:07

jens hat geschrieben:Als erstes mal: http://www.python-forum.de/faq.php#21 :!:
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>
.....
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
cirox
User
Beiträge: 8
Registriert: Mittwoch 8. November 2006, 19:07

Hallo,

ich bekomm leider auch mit Deinem bereinigten Code wieder einen Download.

gruß cirox
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

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.
cirox
User
Beiträge: 8
Registriert: Mittwoch 8. November 2006, 19:07

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten