String zu Objektpfad auflösen.

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Mittwoch 18. Januar 2006, 06:21

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 :(
TUFKAB – the user formerly known as blackbird
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Mittwoch 18. Januar 2006, 07:28

Ok. Ich glaub ich hab das Problem lösen können. Aktueller Ansatz unter http://wsgiarea.pocoo.org/trac/browser/ ... on.py#L134
TUFKAB – the user formerly known as blackbird
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Mittwoch 18. Januar 2006, 12:31

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.
Antworten