2009-04-28 2 views
1

Ich bin neu in mod_python und Apache, und ich habe Probleme, eine Datei an einen Benutzer nach einer GET-Anfrage zu senden. Ich habe jetzt eine sehr einfache Einrichtung bekam, und hatte gehofft, einfach die Datei öffnen und schreiben Sie es auf die Antwort:Wie öffne und übertrage ich eine Datei auf dem Dateisystem in mod_python?

from mod_python import apache 

def handler(req): 
    req.content_type = 'application/octet-stream' 
    fIn = open('response.bin', 'rb') 
    req.write(fIn.read()) 
    fIn.close() 
    return apache.OK 

Aber ich bin immer Fehler, wenn ich open() und sagte, dass die Datei existiert nicht (obwohl ich ein Dutzend Mal überprüft habe, dass es funktioniert). Dies geschieht bei der Verwendung von relativen und absoluten Dateipfaden.

Ich habe zwei Fragen bekam:

  • Warum nicht geöffnet ist() Dateien die richtige zu finden?
  • Was ist der beste Weg, um eine Datei aus dem Dateisystem zurückgeben? (Ich frage um sicherzustellen, dass ich nicht etwas besseren Weg fehlt mod_python zu verwenden, um eine Datei zurückzukehren.)

Dank

Edit: Nach dem Auffinden dieses Themas: http://www.programmingforums.org/thread12384.html ich, dass offene entdeckt() funktioniert für mich, wenn ich die Datei in ein anderes Verzeichnis außerhalb von zu Hause verschiebe (ich habe Alias ​​von/home/myname/httpdocs gemacht, aber es funktioniert, wenn ich/data verwende). Irgendwelche Ideen, warum das funktioniert?

Edit 2: Ein Teil meiner Debug-Fehler, wie gewünscht:

MOD_PYTHON ERROR 

ProcessId:  13642 
Interpreter: '127.0.1.1' 

ServerName:  '127.0.1.1' 
DocumentRoot: '/var/www' 

URI:   '/test/mptest.py' 
Location:  None 
Directory:  '/home/myname/httpdocs/' 
Filename:  '/home/myname/httpdocs/mptest.py' 
PathInfo:  '' 

Phase:   'PythonHandler' 
Handler:  'mptest' 

Traceback (most recent call last): 

    File "/usr/lib/python2.5/site-packages/mod_python/importer.py", line 1537, in HandlerDispatch 
    default=default_handler, arg=req, silent=hlist.silent) 

    File "/usr/lib/python2.5/site-packages/mod_python/importer.py", line 1229, in _process_target 
    result = _execute_target(config, req, object, arg) 

    File "/usr/lib/python2.5/site-packages/mod_python/importer.py", line 1128, in _execute_target 
    result = object(arg) 

    File "/home/myname/httpdocs/mptest.py", line 13, in handler 
    fIn = open('/home/myname/httpdocs/files/response.bin', 'rb') 

IOError: [Errno 2] No such file or directory: '/home/myname/httpdocs/files/response.bin' 

Antwort

4

diese Art der Sache zu debuggen, müssen Sie alle Informationen aus der laufenden Mod_python Instanz sammeln.

Stoppen Sie das Durcheinander mit "ein Dutzend Mal überprüfen, dass es [existiert]". Einige Annahmen sind nicht korrekt.

Tun Sie etwas, um einige Debugging-Informationen zu erhalten.

def handler(req): 
    req.content_type = 'text/plain' 
    req.write(os.environ) 
    req.write(os.getcwd()) 
    # etc. 
    return apache.OK 

bearbeiten

Jetzt haben Sie einen Blick auf die Wichtige Stuff. In diesem Fall sind es möglicherweise Berechtigungen - Sie müssen os.filestat verwenden, um sicher zu gehen. Apache führt mod_python als einen Benutzer aus, der fast keine verwendbaren Berechtigungen hat. Apache mag keine Links, aber dies sollte sich nicht auf mod_python auswirken. Wenn Ihre Datei nicht "Read-by-Everybody" enthält und sich nicht im richtigen Verzeichnis befindet, haben Sie Probleme.

Sie möchten möglicherweise zu mod_wsgi wechseln.

+0

Ich habe meine Frage aktualisiert, nachdem ich einen Hinweis auf, was los ist. Außerdem habe ich deinen Ratschlag ausprobiert und einige interessante Fakten herausgefunden: mod_python läuft als "www-data" und hat keine "/". –

0

Können Sie die Fehler einfügen, die Sie erhalten?

Wahrscheinlich handelt es sich um einen Berechtigungsfehler (wenn Sie versucht haben, den vollständigen Pfad zur Datei zu verwenden). Denken Sie daran, dass das Skript als der Benutzer ausgeführt wird, der den Web-Server-Prozess ausführt - Sie werden also normalerweise auf die Datei als "www-data" oder "nobody" zugreifen.

Überprüfen Sie die Berechtigungen des Ordners /home/myname/httpdocs/files/ auch.Der Ordner sollte +x für die www-data Benutzer sein:

$ mkdir blah 
$ echo works > blah/response.bin 
$ chmod 000 blah/ 
$ cat blah/response.bin 
cat: blah/response.bin: Permission denied 
$ chmod +x blah/ 
$ cat blah/response.bin 
works 

Sie könnten Apache/your-Skript aus der Gleichung eliminieren die durch folgende Schritte ausführen:

you:~$ sudo su - www-data 
www-data:~$ file /home/myname/httpdocs/files/response.bin 

(das so nicht funktionieren können, je nachdem, was OS/Distribution Sie verwenden, zum Beispiel OS X verhindert, dass Sie sich anmelden, wie es ist www Benutzer)

Datei Berechtigungen beiseite, warum ist das Skript sowieso abhängig von einer Datei in Ihrem Home-Ordner? Kann response.bin in den gleichen Ordner wie Ihr Python-Skript verschoben werden? Oder vielleicht sogar in eine Datenbank gezogen? (vielleicht SQLite? Kann unnötig/übermäßig sein, je nachdem, was in response.bin ist und wie viel es ändert)

+1

Ich habe den größten Teil eines Fehlers in meine Frage eingefügt. Jedoch habe ich versucht, die Dateien zu www-Daten ohne Erfolg zu chowning. (Vielleicht bin ich Missverständnis Unix OS Berechtigungen, obwohl) –

Verwandte Themen