[colubrid] ObjectApplication vs. RegexApplication

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Erstmal zwei Links:
http://wiki.python.de/Colubrid/ObjectApplication
http://wiki.python.de/Colubrid/RegexApplication
oder
http://wsgiarea.pocoo.org/colubrid/docu ... pplication
http://wsgiarea.pocoo.org/colubrid/docu ... pplication


Ich hatte mir erst ObjectApplication angesehen und fand das super. Gerade weil man schön Bereiche auf Klassen auftrennen kann, das gefällt mir sehr gut.

Nun ist es aber so, das ich folgende Programmteile/URLs realisieren möchte:

/download/verz-1/.../verz-n

/upload/datei

/info/

Dabei möchte ich das Aufteilen in die drei Klassen "download", "upload" und "info" um dann die jeweiligen Funktionen schön zu trennen.

Das geht aber nicht:

Code: Alles auswählen

import posixpath
from colubrid import ObjectApplication


class base(object):
    def _info(self, methodname):
        self.request.write("<h3>Aufruf von '%s'</h3>\n" % methodname)


class index(base):
    def index(self):
        self._info('index.index') # Globale info-Methode aufrufen


class download(base):
    def index(self, path="/"):
        self._info('download.index')
        self.request.echo("path:", path)

class upload(base):
    def index(self, filename=None):
        self._info('upload.index')
        self.request.echo("filename:", filename)

class info(base):
    def index(self):
        self._info('info.index')



class DispatcherApplication(ObjectApplication):
    """
    Die Haupt-Klasse, setzt die Programmlogik um.
    """

    # Setzt den Objekt-Baum für die URLs zusammen
    root = index
    root.download = download
    root.upload = upload
    root.info = info

    def process_request(self):
        super(DispatcherApplication, self).process_request()
        self.on_close()

    def on_close(self):
        """
        URL Liste aufbauen, damit sie direkt "anklickbar" sind
        """
        self.request.write("<p><h3>Available URLs:</h3>\n")

        for url in ("", "download", "download/verz1", "download/verz1/verz2",\
                "upload", "upload/file1", "info", "NotExists!"):
            self.request.write(
                '<a href="%s">/%s</a><br/>\n' % (
                    posixpath.join(self.request.environ["SCRIPT_ROOT"], url),
                    url
                )
            )

        self.request.write("</p>\n")




app = DispatcherApplication

if __name__ == '__main__':
    from colubrid import execute
    execute()
Weil bei download.index() der Pfad nur übergeben wird, wenn es nur ein Verz gibt... Wenn es zwei Verzeichnisse sind, gibt es ein 404 Fehler... Das ist schade...

Nun könnte ich eine RegexApplication machen mit:

Code: Alles auswählen

    urls = [
        (r'^$', 'index'),
        (r'^download/(.*?)$', 'download')
        (r'^upload/(.*?)$', 'upload')
        (r'^info/$', 'info'),
    ]
Dabei gefällt mir allerdings nicht, das ich hinterher eine riesige Klasse klasse mit allen Funktionen hab.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich denke dem am nächsten kommt noch die PathApplication

Nur leider hab ich dann auch keine getrennten Klassen...
Und man ist leider auf eine Ebene beschränkt... Also das würde nicht gehen: "/info/", "/info/status", "/info/setup" gemappt auf: info().index(), info().status(), info().setup() :?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ha! Ich sehe gerade, das die RegexApplication mehr kann, als in der Doku steht! Somit kann ich direkt das machen, was ich wollte :lol:

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