Seite 1 von 1

String zu Objektpfad auflösen.

Verfasst: Mittwoch 18. Januar 2006, 06:21
von mitsuhiko
Zunächst hab ich jetzt mal das hier:

Code: Alles auswählen

from colubrid.application import ObjectApplication

class Blog(object):

    def index(self):
        self.request.write('Index Page')

    def archive(self, year, month, day):
        self.request.write('Blog Entries for %s/%s/%s' % (year, month, day))
        
    def article(self, article_id):
        self.request.write('Blog Entry %s' % article_id)
        
    def about(self):
        self.request.write('The About Page.')


class HelloWorld(object):

    def index(self):
        self.request.write('Hallo Welt')


class Admin(object):

    def index(self):
        self.request.write('The Admin Index Page')


class Application(ObjectApplication):
    root = HelloWorld()
    root.blog = Blog()
    root.admin = Admin()
Eine übermittelte URL muss jetzt dann aufgelöst werden.

http://www.server.com/
--> root.index()
http://www.server.com/blog/archive/2005/01/18/
--> root.blog.archive('2005', '01', '18')
http://www.server.com/blog/article/481/
--> root.blog.article('481')
http://www.server.com/admin/
--> root.admin.index()

Und jetzt die Preisfrage: Wie komm ich dort hin, wo ich hinwill? Meine Idee ist es den Pfad mal mit strip() so behandeln, dass hinten und vorne keine slashes mehr sind, und dann an den slashes splitten.
Danach für jeden URL Part schauen, obs da mit hilfe von getattr() da was gibt, bei Fehlerfall schaun obs ein index gibt. aber irgendwie ist das alles nicht so einfach :(

Verfasst: Mittwoch 18. Januar 2006, 07:28
von mitsuhiko
Ok. Ich glaub ich hab das Problem lösen können. Aktueller Ansatz unter http://wsgiarea.pocoo.org/trac/browser/ ... on.py#L134

Verfasst: Mittwoch 18. Januar 2006, 12:31
von modelnine
Ich würde das mit irgendwas wie folgendem Code machen:

Code: Alles auswählen

import posixpath

def splitpath(p):
    p, e = posixpath.split(posixpath.normpath(posixpath.join("/",p))+(p and p[-1] == "/" and "/" or ""))
    return (filter(lambda s: bool(s),p.split("/")),e)
Anwendung:

Code: Alles auswählen

>>> splitpath("/test/pfad/mit/../drin")
(['test', 'pfad'], 'drin')
>>> splitpath("/test/pfad/mit/../drin/")
(['test', 'pfad', 'drin'], '')
Das posixpath-Modul ist auf jeder Plattform verfügbar, nur nicht standardmäßig os.path, sondern nur auf POSIX Plattformen. Also auf jeden Fall sicher direkt zu importieren.

Und den restlichen Kram, wie man rekursiv getattr() über die Liste aufruft, überlass ich Dir. ;-)

--- Heiko.