2016-05-13 8 views
6

Wie behandelt man in einer Traversal-Pyramiden-App eine Ressource mit __name__, die mit dem Namen einer Ansicht übereinstimmt?Pyramid Traversal __name__ entspricht einem Ansichtsnamen

Wenn ich auf die Ansicht aufrufen "Ansicht" für eine Ressource abrufen wollte, würde ich einen URL-Pfad wie verwenden: /foo/bar/view. Er durchquert die resource_tree wie so:

RootFactory(request) => RootFactory 
RootFactory['foo'] => Foo 
Foo['bar']   => Bar 
Bar['view']   => KeyError 

... und weil es nicht in der Vergangenheit Bar durchqueren kann & ‚view‘ übrig bleibt, geht davon aus, dass ‚Ansicht‘ ist der Ansicht Namen und passt meiner Ansicht aufrufbar

@view_config(name='view') 
def view(context, request): 
    return Response(context.__name__) 

Um die URL für diesen Pfad erhält ich request.resource_url(resource, "view" verwenden würde).

Wenn ich jedoch eine Ressource wie Bar.__name__ = "view" hatte, wie kann ich eine URL für "view" auf Foo auflösen?

# path: /foo/view 
RootFactory(request) => RootFactory 
RootFactory['foo'] => Foo # ideally stop here with view_name="view" 
Foo['view']   => Bar.__name__ = "view" 
# all parts of path matched so view_name="" and context=Bar 

Idealerweise in dieser Situation würde /foo/view-view(Foo, request) zeigen und /foo/view/view-view(Bar, request) wo Bar.__name__ == "view" zeigen würde.

Gibt es eine Möglichkeit, dies zu behandeln, ohne Erkennung für Kollisionen zwischen __name__ und Ansichtsnamen schreiben?

Antwort

0

Die Lösung, die ich aufwickelte, ist das Hinzufügen einer beliebigen Schicht von Containerressourcen.

Unten ist ein Beispiel für die Struktur der Ressourcen:

class Foo(object): 

    def __init__(self, parent, name): 
     self.__parent__ = parent 
     self.__name__ = name 

    def __getitem__(self, key): 
     if key == "bar": 
      return BarContainer(self, "bar") 
     else: 
      raise KeyError() 

class BarContainer(object): 

    def __init__(self, parent, name): 
     self.__parent__ = parent 
     self.__name__ = name 

    def __getitem__(self, key): 
     return Bar(self, key) 

class Bar(object): 

    def __init__(self, parent, name): 
     self.__parent__ = parent 
     self.__name__ = name 

Die Frage Ressource URLs zur Ansicht aufrufbar betitelten Ansicht erzeugen Nennungen zu wollen. Mit BarContainer fügt dies nur einen zusätzlichen Schrägstrich hinzu:

/{foo}/bar/{bar}/<view_name>  
/a/view   => view(context=Foo(name='a'), request) 
/a/bar/view  => view(context=BarContainer(name='bar'), request) 
/a/bar/b/view => view(context=Bar(name='b'), request)