Seite 1 von 1

alle inhalte ueber ein pythonscript leiten...

Verfasst: Mittwoch 14. Februar 2007, 10:38
von nkoehring
Hallo... zur effektiven Verschwendung von Zeit, die ich sonst mit Lernerei verbringen wuerde, schreib ich hier mal ein Thema an, dass mich interessiert :)

Im moment bastle ich an einem Konzept fuer meine Homepage und habe herausgefunden, dass man durchaus alles ueber eine einzige Datei schicken kann. Sozusagen lasse ich den Apache immer die index.py aufrufen. Im Request stehen dann so interessante Sachen wie der Pfad, der aufgerufen wurde.

So sieht meine .htaccess dafuer aus...

Code: Alles auswählen

SetHandler python-program
PythonHandler index
DirectoryIndex index.py
Options -Indexes
ErrorDocument 403 /~hurz/index.py
ErrorDocument 404 /~hurz/index.py
So kann ich jetzt an die URI anhaengen was ich will, es kommt immer meine index.py heraus.

Im moment ist es nur eine Versuchsdatei. Sie gibt entweder einfach nur den Pfad aus und dazu, ob er existiert oder nicht... oder (im moment teste ich das) versucht einen Mime-Typ durch die Dateiendung herauszufinden und gibt einfach den Inhalt der Datei direkt an den Browser zurueck
Sicherlich bringt das im Moment mehr Umstaende als Nutzen, aber am Ende will ich durch Meta-Daten und Grundeinstellungen ein Sicherheits- und Praesentationskonzept daraus zaubern.

Nun meine Frage... ich habe ja am Ende einen gewissen "Content" auf meiner Seite (sollte so sein ;) ) und moechte diesen parseable in .inc-Dateien ablegen, die dann per Pfad uebergeben und geparst werden.

Gibt es dazu Meinungen von euch? Wie zB: Nimm doch lieber eine Datenbank... oder: Hey wieso nutzt du nicht XYZ, das macht doch eigentlich das gleiche?

BTW: Ich habe keine freie Verfuegung ueber den Server und kann somit nicht viel machen, wenn es um nachzuinstallierende Software geht.

BTW2: Ich bastle gern ;)

BTW3: Der PythonHandler laesst sich nicht aendern... ich weiß nicht wieso.

Verfasst: Mittwoch 14. Februar 2007, 18:52
von Y0Gi
"Alles" über eine Datei laufen zu lassen, ist in der Tat praktisch, mache ich auch so, allerdings über mod_rewrite. Zumal ich über sowas wie

Code: Alles auswählen

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$      app.py     [PT,QSA,L]
auch den Pfad (PATH_INFO bei WSGI) übergeben bekomme und den nach Belieben verarbeiten und danach routen kann.

Ob es allerdings Sinn macht, über das zentrale Script auch Fehlerseiten zu erzeugen (ich schlage ein kompaktes eigenständiges vor, wenn man nicht drauf verzichten kann), ist fraglich. Insbesondere wenn das Script selbst Fehler wirft, geht es rund. Und für eine Fehlerseite das komplette Layout drumherum einzufügen, hat mindestens auch diesen Nachteil.

Wenn du Inhalte in .inc-Dateien ablegst, solltest du sicherstellen, dass diese nicht frei zugreifbar sind (z.B. über mod_rewrite oder Benutzerrechte ein 403 Forbidden oder 404 Not Found liefern lassen). Gewöhnlich wird diese Endung nämlich nicht geparst und daher im Quelltext ausgeliefert; oder aber durch PHP, und das kann auch unschöne Effekte haben.

Verfasst: Mittwoch 14. Februar 2007, 21:12
von nkoehring
Wenn ich eine Datei aufrufe ist die Endung egal. Selbst eine existente html-Datei wuerde nicht geparst werden, sondern mein Script wuerde dir sagen, ob es existiert oder nicht. Also keine Chance die .inc-Dateien unkontroliert als text/plain anzeigen zu lassen.

Verfasst: Mittwoch 14. Februar 2007, 22:41
von nkoehring
Was mich uebrigens total nervt sind die Fehler! Wenn ich einen noch so spartanischen Fehler habe, erhalte ich nen InternalServerError (500) ...okay, ich will aber nen StackTrace... der waer mir um einiges lieber (verstaendlicherweise).

Ist es irgendwie drin, den StackTrace des Python-Interpreters direkt als Fehlerseite zu bekommen?

Ich wuerd ja sonst einfach die Konsole schnappen... aber Apache von mod_python einzubinden funktioniert da ja nicht. Und mit meinen eigens gebauten req- und apache-Klassen tritt kein Fehler auf -.-

Verfasst: Mittwoch 14. Februar 2007, 23:00
von Leonidas
nkoehring hat geschrieben:Ist es irgendwie drin, den StackTrace des Python-Interpreters direkt als Fehlerseite zu bekommen?
cgitb, die Traceback-Anzeige von Django, die Traceback-Utilities die für WSGI angeboten werden.

Natürlich fallen die ersten zwei Möglichkeiten so ziemlich weg, wenn du mod_python direkt verwendest, aber es wäre sicherlich nicht verkehrt gleich WSGI zu nutzen.

Verfasst: Mittwoch 14. Februar 2007, 23:08
von nkoehring
ja ehm... sag das meinem admin :(

Aber naja, ich werd mir das anders bauen... ich weiß schon wie :D
Sobald ich die Loesung fertig hab, werd ich es der Allgemeinheit natuerlich zur Verfuegung stellen. 8)

Verfasst: Mittwoch 14. Februar 2007, 23:27
von Leonidas
nkoehring hat geschrieben:ja ehm... sag das meinem admin :(
Ich würde jetzt meine Hand nicht ins feuer legen, aber wenn du für index.py eine WSGI-App unterstelltst, könnte das gehen. Ist aber jetzt ohne Belege, da ich WSGI nur über FastCGI nutze.

Verfasst: Mittwoch 14. Februar 2007, 23:29
von nkoehring
Ach wie schnell das gehen kann, wenn man eine einfache Loesung parat hat... hier der wichtigste Teil der index.py (die alles parsed). Die Datei index2.py enthaelt dann all die Arbeit und somit all die potenziellen Fehlerquellen ;)

Code: Alles auswählen

import traceback
import sys
from mod_python import apache
from mod_python import util

def handler(req):
    try:    
        import index2
        content_type, content = index2.handler(req, return_content=True)
    except:
        content_type = "text/plain"
        content = ''.join(traceback.format_exception(sys.exc_type,sys.exc_value,sys.exc_traceback))

    req.content_type = content_type
    req.send_http_header()
    req.write(content)
    return apache.OK

Verfasst: Donnerstag 15. Februar 2007, 00:49
von Y0Gi
nkoehring hat geschrieben:Wenn ich eine Datei aufrufe ist die Endung egal. Selbst eine existente html-Datei wuerde nicht geparst werden, sondern mein Script wuerde dir sagen, ob es existiert oder nicht. Also keine Chance die .inc-Dateien unkontroliert als text/plain anzeigen zu lassen.
Natürlich, das hatte ich unter den geschaffenen Bedingungen übersehen.


Bzgl. Integration mod_python/WSGI kannst du dir mal paste.mod_python ansehen. Über WSGI hast du in der Tat sehr schöne Debugging-Möglichkeiten. Inwieweit man alleine mit mod_python sowas wie das cgitb-Modul benutzen kann (was mit WSGI geht) weiß ich nicht, aber mod_python braucht man auch offenbar nicht.